Kann ich Parametern oder optionalen Parametern in C # -Funktionen einen Standardwert zuweisen?

75

Kann ich Standardparameter in C # angeben?

In C:

void fun(int i = 1)
{
    printf("%d", i);
}

Können wir Parametern einen Standardwert geben? Ist es in C # möglich? Wenn ja, können wir Überlastungsfunktionen vermeiden?

Es ist immer eine schlechte Praxis, einer vorhandenen Funktion einen optionalen Parameter hinzuzufügen. Wenn Sie an einem Projekt arbeiten, das auf die Klasse mit einer Funktion verweisen muss, und wir einen Parameter mit einem optionalen Wert geändert haben, wird möglicherweise eine Laufzeitausnahme ausgelöst, dass die Methode nicht gefunden wird.

Dies liegt daran, dass wir berücksichtigen werden, dass beim Hinzufügen eines zusätzlichen optionalen Werts keine Codeänderung erforderlich ist, wenn die Funktion an vielen Stellen verwendet wird.

function Add(int a, int b);

Dies wird folgendermaßen aufgerufen:

Add(10, 10);

Wenn wir jedoch einen optionalen Parameter wie diesen hinzufügen,

function Add(int a, int b, int c = 0);

dann erwartet der Compiler

Add(10, 10, 0);

Eigentlich rufen wir so auf Add(10, 10)und diese Funktion ist in dieser Klasse nicht verfügbar und verursacht eine Laufzeitausnahme.

Dies geschieht, während einer Funktion, die von vielen Stellen aufgerufen wird, ein neuer Parameter hinzugefügt wird, und ich bin mir nicht sicher, ob dies jedes Mal passieren wird. Ich empfehle Ihnen jedoch, die Funktion zu überlasten.

Wir müssen immer die Methode überladen, die einen optionalen Parameter hat. Auch wenn Sie mit Funktionen arbeiten, die mehr als einen optionalen Parameter haben, ist es gut, den Wert mit dem Namen des Parameters zu übergeben.

function Add(int a, int b, int c = 0);

Es ist immer gut, diese Funktion folgendermaßen aufzurufen.

Add(10, 20, c:30);
kbvishnu
quelle
1
@Vyas jetzt C # 4.0 ist es möglich
kbvishnu
@nawfal hat es einen langen Rücken gefragt und während ich mit optionalen Parametern arbeite habe ich einige Probleme. Also habe ich die Frage aktualisiert.
Kbvishnu
1
@VeeKayBee das ist richtig, aber hattest du da eine Frage (in der Bearbeitung)? Wenn Sie darauf hinweisen möchten, warum beantworten Sie es nicht in einem relevanten Thread (möglicherweise sogar in diesem)?
Nawfal
@nawfal danke für deinen Vorschlag. Ich werde als Antwort aktualisieren
kbvishnu

Antworten:

78

Genau so machen Sie es in C #, aber die Funktion wurde zuerst in .NET 4.0 hinzugefügt

Futter
quelle
4
Es ist möglich, es in .NET 3.5 zu verwenden
Marek Kwiendacz
Visual Studio 2010+hat msbuildmit multitargetingFunktion ( msdn.microsoft.com/en-us/library/vstudio/… ). Es kann .NET 4.0Zielpakete verwenden, um Ihre optionalen Parameter in eine Reihe überladener Methoden zu integrieren.
Dbardakov
Was ist mit Inline-Methoden (Func, Action, Delegate)?
EricG
42

Ja. Siehe Benannte und optionale Argumente . Beachten Sie, dass der Standardwert eine Konstante sein muss. Dies ist also in Ordnung:

public string Foo(string myParam = "default value") // constant, OK
{
}

aber das ist nicht:

public void Bar(string myParam = Foo()) // not a constant, not OK
{
}
Krapfen
quelle
27

Dies ist nur ab C # 4.0 möglich

Wenn Sie jedoch eine Version von C # vor 4.0 verwenden, können Sie dies mithilfe überladener Methoden umgehen:

public void Func( int i, int j )
{
    Console.WriteLine (String.Format ("i = {0}, j = {1}", i, j));
}

public void Func( int i )
{
    Func (i, 4);
}

public void Func ()
{
    Func (5);
}

(Oder Sie können natürlich auf C # 4.0 upgraden).

Frederik Gheysels
quelle
5

Ja, aber Sie müssen .NET 3.5 und C # 4.0 verwenden, um diese Funktionalität zu erhalten.

Diese MSDN-Seite enthält weitere Informationen.

ChrisF
quelle
1

Diese Funktionalität ist ab C # 4.0 verfügbar - sie wurde in Visual Studio 2010 eingeführt. Sie können sie in Project for .NET 3.5 verwenden. Daher müssen alte Projekte in .NET 3.5 nicht auf .NET 4.0 aktualisiert werden.

Sie müssen nur Visual Studio 2010 verwenden, aber denken Sie daran, dass es auf die Standard-Sprachversion kompiliert werden sollte (legen Sie es unter Projekteigenschaften-> Buid-> Erweitert ... fest).

Diese MSDN-Seite enthält weitere Informationen zu optionalen Parametern in VS 2010.

Marek Kwiendacz
quelle
0

Dies ist eine Funktion von C # 4.0, war jedoch ohne die Verwendung von Funktionsüberladung vor dieser Version nicht möglich.

Øyvind Bråthen
quelle