Prüfe innerhalb der Methode, ob ein optionales Argument übergeben wurde

8

Wie überprüfe ich, ob ein optionales Argument an eine Methode übergeben wurde?

%Vor%

Ein anderer Ansatz ist die Verwendung von Nullable<T>.HasValue ( MSDN-Definitionen , MSDN-Beispiele ):

%Vor%     
Yariv 02.01.2014, 16:05
quelle

8 Antworten

12

Nun, Argumente werden immer weitergegeben. Standardmäßige Parameterwerte stellen nur sicher, dass der Benutzer sie nicht explizit beim Aufruf der Funktion explizit angeben muss.

Wenn der Compiler einen Aufruf wie folgt sieht:

%Vor%

Es konvertiert es still zu:

%Vor%

Es ist also technisch nicht möglich festzustellen, ob das Argument zur Laufzeit übergeben wurde. Der nächste, den Sie bekommen könnten, ist:

%Vor%

Aber das würde sich genauso verhalten, wenn der Benutzer es explizit so nennt:

%Vor%

Wenn Sie wirklich ein anderes Verhalten haben wollen, je nachdem, ob ein Parameter angegeben ist oder nicht, dann sollten Sie die Standardparameter loswerden und stattdessen Überladungen verwenden, wie folgt:

%Vor%     
p.s.w.g 02.01.2014 16:07
quelle
6

Das geht grundsätzlich nicht. Die für diese Aufrufe generierte IL ist genau gleich:

%Vor%

Der Standard wird am Aufrufort vom Compiler ausgeführt.

Wenn Sie wirklich wollen, dass beide Aufrufe gültig aber unterscheidbar sind, können Sie einfach überladen:

%Vor%     
Jon Skeet 02.01.2014 16:07
quelle
4

Sie können dies nicht in C # tun.

Allerdings könnten Sie die Funktion überladen, um andere Argumente zu verwenden. Das ist übrigens der einzige Ansatz, den Sie in Java anwenden können, damit Sie in guter Gesellschaft sind, wenn Sie es übernehmen.

    
Bathsheba 02.01.2014 16:09
quelle
3

Sie können das nicht überprüfen, da die Methode mit optionalen Parametern eine reguläre Methode mit allen Parametern ist, einschließlich derjenigen, die Standardwerte haben. Ihre Methode wird also in folgende Elemente übersetzt:

%Vor%

Standardwerte werden vom Compiler in den Aufrufpunkt eingefügt. Wenn du schreibst

%Vor%

Dann generiert der Compiler den Aufruf

%Vor%

Sie können vergleichen, ob optionalstr oder optionalint einen Wert hat, der dem Standardwert entspricht, aber Sie können nicht wirklich sagen, ob es vom Compiler oder vom Entwickler bereitgestellt wurde.

    
Sergey Berezovskiy 02.01.2014 16:07
quelle
2

Sie können das nicht, also müssen Sie einen anderen Weg finden, nach dem "optionalen" Parameter zu suchen. Sie können eine Null übergeben, wenn der Parameter nicht verwendet wird, und dann

prüfen %Vor%

Sie können die Methode auch überladen, wobei eine die optionalen Parameter und eine die optionalen Parameter nicht verwendet. Sie können auch festlegen, dass die Methode ohne die optionalen Parameter Nullen an eine der überladenen Methoden übergibt.

%Vor%     
ScottK 02.01.2014 16:11
quelle
1

Sie können nicht direkt überprüfen, aber Sie können es nach dem Standardwert überprüfen. zum Beispiel:

%Vor%

oder

%Vor%

Ansatz 2:

Sie können auch Überschreibungsmethoden verwenden:

%Vor%     
Hadi Sharifi 02.01.2014 16:13
quelle
0

Ein anderer Ansatz ist die Verwendung von Nullable<T>.HasValue ( MSDN-Definitionen , MSDN-Beispiele ):

%Vor%     
Yariv 02.01.2014 17:42
quelle
-1

Um festzustellen, ob ein Argument an einen optionalen Parameter

übergeben wurde
  1. Definieren Sie einen extrem unwahrscheinlichen Wert als Standard für den Parameter.
  2. Wenn der optionale Parameter ein Referenztyp ist, z. B. ein String , können Sie null als Standardwert verwenden, sofern dies kein erwarteter Wert für das Argument ist.
  3. Vergleichen Sie im Prozedurcode den Parameter mit dem Standardwert und ergreifen Sie die entsprechende Aktion.

Ссылка

    
OrganicCoder 05.01.2017 21:30
quelle