Überprüfen Sie das innere Methode, ob ein optionales argument übergeben wurde
Wie kann ich überprüfen, ob ein optionales argument an eine Methode übergeben?
public void ExampleMethod(int required, string optionalstr = "default string",
int optionalint = 10)
{
if (optionalint was passed)
return;
}
Ein weiterer Ansatz ist die Verwendung Nullable<T>.HasValue
(MSDN-Definitionen, MSDN-Beispiele):
int default_optionalint = 0;
public void ExampleMethod(int required, int? optionalint,
string optionalstr = "default string")
{
int _optionalint = optionalint ?? default_optionalint;
}
- Was ich meistens tun, ist geben Sie einen Standardwert (fi -1 in deinem Fall). Wenn es einen anderen Wert als -1 übergeben wurde. Man könnte auch machen das int nullable (int?) und geben Sie den Standardwert null
- Warum würden Sie wollen, dies zu überprüfen? Der Punkt, der ein Standard ist, dass Sie brauchen nicht zu wissen
- aus der MSDN-Website:"Für ein Beispiel, wenn möglicherweise verwenden Sie eine nullable-Typ, betrachten, wie ein gewöhnliches Boolean-Variablen können zwei Werte haben: true und false. Es gibt keinen Wert, der bedeutet "undefiniert"."
- Nullable-Typen und optionalen Parameter werden mot der gleichen Sache.
- Wenn Sie wollen einfach nur, um Doppelarbeit zu vermeiden-Konstanten im Vergleich (wenn ("default string" == "default string"), und nicht wirklich überprüfen, ob der parameter übergeben wurde, Sie könnte verwenden Sie reflektion, um Standard zu vergleichen und dann das. Wohl ein bisschen over the top, aber dann sollten Sie in der Lage, ändern der Standard-parameter in der Signatur, ohne änderungen am code. stackoverflow.com/a/29156478/586754
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, die Argumente sind immer übergeben. Die Standardwerte der parameter nur sicherzustellen, dass die Benutzer nicht haben, um explizit Sie angeben, wenn Sie die Funktion aufrufen.
Wenn der compiler auf einen Aufruf wie dieser:
Schweigend wandelt es zu:
Es ist also nicht techically möglich, zu bestimmen, wenn das argument übergeben wurde, zur Laufzeit. Die nächsten, die Sie bekommen konnte ist:
Aber das würde sich gleich Verhalten, wenn der user nannte es explizit so:
Die alternative, wenn Sie wirklich wollen, zu haben, die sich anders Verhalten, je nachdem, ob ein parameter angegeben wird, ist, um loszuwerden, der Standard-Parameter und verwenden Sie überlastungen statt, wie diese:
ExampleMethod(10, null)
, die nicht vonExampleMethod(10)
zur Laufzeit. Obwohl, das könnte ausreichend sein, für Ihre Zwecke.Kann man nicht, im Grunde. Die IL generiert für diese Gespräche ist genau das gleiche:
Den säumigen erfolgt auf den Ruf Website, die durch den compiler.
Wenn Sie wirklich wollen, diese beiden Anrufe, um gültig zu sein, aber unterscheidbar sind, können Sie einfach überladen:
Können Sie nicht tun dies in C#.
Jedoch, Sie könnte überlast die Funktion zu nutzen, unterschiedliche Argumente. Das, übrigens, ist die nur Ansatz in Java, damit wären Sie in guter Gesellschaft, wenn Sie es annehmen.
Können Sie nicht überprüfen, weil die Methode mit optionalen Parametern ist eine herkömmliche Methode mit allen Parametern, einschließlich derjenigen, die default-Werte. Also, deine Methode kompiliert, in:
Default-Werte eingefügt werden durch compiler in den Aufruf zeigen. Wenn Sie schreiben
Dann compiler generiert rufen
Können Sie vergleichen, wenn
optionalstr
oderoptionalint
hat Wert gleich dem default-Wert, aber Sie können nicht wirklich sagen, ob es vorgesehen war, durch den compiler oder durch den Entwickler.default_optionalint
übergeben wurden, um Ihre Methode manuell. Default-Wert ist nur einer der möglichen Werte der parameter haben kann.Können Sie nicht, Sie müssen also einen anderen Weg finden, um zu überprüfen für die "optionale" parameter. Sie können übergeben Sie eine null, wenn der parameter nicht verwendet wird, und überprüfen Sie dann
Können Sie auch die überlastung der Methode, dass eine Einnahme der optionale Parameter und einen, der nicht nehmen Sie die optionalen Parameter. Auch, Sie können es so machen, dass die Methode ohne den optionalen Parameter übergibt, null-Werte, um eine der überladenen Methoden.
kann man nicht direkt schauen aber Sie können es überprüfen, indem Sie den Standardwert.
zum Beispiel:
oder
Ansatz 2:
Außerdem können Sie überschreiben von Methoden:
if (required.HasValue==false)
- Benötigt keine null-Werte zulässt.Ein weiterer Ansatz ist die Verwendung
Nullable<T>.HasValue
(MSDN-Definitionen, MSDN-Beispiele):Necromancing ein Alter thread, aber dachte, ich würde etwas hinzufügen.
Können Sie
default(int)
odernew int()
Für bestimmten Fällen die default-Werte können verwendet werden, um zu überprüfen, wo ein argument übergeben wurde. Dies funktioniert für mehrere Datentypen. https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default-values-table
Besonders gut funktioniert dies bei der übergabe der Datenbank-ids, in denen Aufzeichnungen halten vorzeichenlosen Ganzzahlen größer als 0 ist. Sie wissen also 0 immer null sein, und keine ids kann negativ sein. In anderen Worten, alles andere als Standard(Datentyp) akzeptiert als parameter übergeben.
Würde ich persönlich gehe mit dem überladen von Methoden, aber ein anderer Ansatz (vielleicht ist das außerhalb des Geltungsbereichs dieser Frage) ist es, die input-Parameter in einem Modell. Verwenden Sie dann das Modell, Kraft, Grenzen (wie 10 Standard-parameter), können die Modell-Angebot, mit dem parameter, statt der Methode.
Diese Kräfte Verhalten, bevor es erreicht Ihre Methode.
Hoffe, das jemand hilft.
default(int)
odernew int()
ist genau das gleiche wie mit0
... und es trotzdem nicht verhindern, dass der Anrufer von der Weitergabe in 0 explizit.parameter = default(int) = new int() = 0
ist nicht initialisiert die Methode weiß, dass der parameter ist irrelevant, in diesem Fall überspringen zurück; es ist nicht ein Ende all-Lösung und hat definitiv seine Löcher, aber einen anderen Weg, es zu tun, die ich dachte, dass es hier dokumentieren. Auch ich denke, dass== default(long)
ist mehr lesbar als== 0
haha.default
Betreiber ist orthogonal zu "hast du einen Wert, den Sie glauben wird nie übergeben werden, der ausdrücklich ist, können Sie diese als Standard-parameter". Das ist eine gültige Technik, aber ich denke, Sie haben es mehr verwirrend durch die Einführung der Standard-operator in die Dinge. -1 genauso wahrscheinlich, um ein "nie bestanden bewusst" Wert (vermutlich more wahrscheinlich als 0 ist eigentlich).Verwendung von nullable ist eine gute Lösung.. siehe Beispiel unten
, Um zu bestimmen, ob ein argument übergeben wurde, um einen optionalen parameter
https://msdn.microsoft.com/en-us/library/849zff9h(v=vs. 100).aspx