C# trippel funktion istället för en funktion

Permalänk
Medlem

C# trippel funktion istället för en funktion

Hej,
Jag har stött på ett simpelt C# program som dock fick mig att bli förvirrad endå.

_________
//Microsoft (R) Visual C# Compiler version 3.4.0-beta4-19562-05 (ff930dec)
//Copyright (C) Microsoft Corporation. All rights reserved.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
public class Program
{
private static void Main(string[] args)
{
double fee = CalculateFee();
Console.WriteLine("Fee is {0}", fee);
}
private static double CalculateFee(double dailyRate=500.0, int numberOfDays=1)
{
return dailyRate*numberOfDays;
}
private static double CalculateFee(double dailyRate = 500.0)
{
int defaultNoOfDays = 1;
return dailyRate*defaultNoOfDays;
}
private static double CalculateFee()
{
double dailyRate = 400.0;
int defaultNoOfDays = 1;
return dailyRate*defaultNoOfDays;
}

}
}
___________

Det är frågan om ett program som har en funktion som heter CalculateFee() och den finns utskriven 3 gånger av någon för mig okänd anledning och varje gång ser den typ likadan ut bortsett från ett värde, dailyRate. Om jag skriver in CalculateFee(dailyRate : 375.0) eller CalculateFee(numberOfDays : 4) så får jag olika svar. Fast eftersom den tredje CalculateFee() funktionen har värdet dailyRate = 400 så ser det ut som att en idiot har gjort dessa funktioner då han inte bestämt sig för ett värde utan har två olika värden, 500 och 400, samt gjort 3 funktioner istället för 1.

Den sista funktionen med värdet dailyRate = 400 används om jag skriver in "dailyRate : 375.0" eller "numberOfdays : 4". Alltså verkar det finnas en regel i C# kompilatorn att om man skapar en funktion med samma namn flera gånger då gäller endast den sista funktionen av dem alla, kan det stämma?

Permalänk
Medlem

Det kallas Method/function Overloading och är ett vanligt begrepp inom de flesta programmeringsspråk.

https://www.geeksforgeeks.org/c-sharp-method-overloading/

Skillnaderna mellan de olika funktionerna är hur många parametrar de tar in. Kompilatorn kommer sedan matcha den funktionen som har samma antal parametrar (och av samma typ) med det du skickar in. Så anropar du CalculateFee() utan parametrar kommer den köra den sista av dem.

Anropar du CalculateFee(100) kommer den använda den mittersta av dem.

Anropar du CalculateFee(100, 2) kommer den använda den första av dem.

Det som gör det lite udda är att man satt ett default värde i alla parametrar dailyRate=500.0 och numberOfDays=1 vilket skulle kunna vara vettigt om man inte overloadade methoderna.

Permalänk
Medlem
Skrivet av martengooz:

Det kallas Method/function Overloading och är ett vanligt begrepp inom de flesta programmeringsspråk.

https://www.geeksforgeeks.org/c-sharp-method-overloading/

Skillnaderna mellan de olika funktionerna är hur många parametrar de tar in. Kompilatorn kommer sedan matcha den funktionen som har samma antal parametrar (och av samma typ) med det du skickar in. Så anropar du CalculateFee() utan parametrar kommer den köra den sista av dem.

Anropar du CalculateFee(100) kommer den använda den mittersta av dem.

Anropar du CalculateFee(100, 2) kommer den använda den första av dem.

Det som gör det lite udda är att man satt ett default värde i alla parametrar dailyRate=500.0 och numberOfDays=1 vilket skulle kunna vara vettigt om man inte overloadade methoderna.

Okej. Tänkte lite sådär att det kanske är typ så det funkar fast nu förstår jag exakt. Btw. Det var dailyRate 400 på sista delen av den uppdelade funktionen. Tack för hjälpen.

Permalänk
Medlem
Skrivet av SpecOps:

Fast eftersom den tredje CalculateFee() funktionen har värdet dailyRate = 400 så ser det ut som att en idiot har gjort dessa funktioner då han inte bestämt sig för ett värde utan har två olika värden, 500 och 400, samt gjort 3 funktioner istället för 1.

Överlagring är som sagt rätt vanligt, men du har också rätt i att det här är ett synnerligen dåligt exempel på det. Den andra metoden fyller ingen som helst funktion eftersom den första kan användas i det fallet, och att den tredje använder 400 som värde istället för 500 är bara dålig design. Så det finns ingen anledning att använda överlagring i just det här fallet, och i andra språk som t.ex. C++ så hade man fått kompileringsfel eftersom metodanropen blir tvetydiga.

Ett bättre exempel på överlagring är t.ex. Console.WriteLine som har massor av olika överlagringar istället för att man ska behöva ha olika metodnamn för varje typ som WriteLine kan skriva ut.

Permalänk
Medlem

I C# blir det tvetydigt om man tar bort metoden utan parametrar i detta fall, eftersom de övriga båda har defaultvärden och det då förstås blir svårt att gissa vilken av metoderna man avser anropa. Har man en utan parametrar så blir det ju den istället.

Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."