Unterschied zwischen ParameterInfo.IsOptional und ParameterInfo.HasDefaultValue?

8

Beide klingen ähnlich. Von msdn:

ParameterInfo.IsOptional

  

Ruft einen Wert ab, der angibt, ob dieser Parameter optional ist.

     

Diese Methode hängt von einem optionalen Metadaten-Flag ab. Diese Flagge kann sein   eingefügt von Compilern, aber die Compiler sind nicht dazu verpflichtet.

     

Diese Methode verwendet das optionale Flag der ParameterAttributes   Aufzähler.

ParameterInfo.HasDefaultValue (neu in .NET 4.5)

  

Ruft einen Wert ab, der angibt, ob dieser Parameter einen Standardwert hat.

Sind sie nicht die Gleichen? Ich habe einen schnellen Test gemacht:

%Vor%

Ich schrieb:

%Vor%

Also in welchem ​​Kontext sind sie anders? Warum hat BCL HasDefaultValue in .NET 4.5 neu eingeführt?

    
nawfal 24.04.2013, 08:06
quelle

3 Antworten

6

Wenn wir uns die Implementierung von IsOptional anschauen, werden wir sehen:

%Vor%

Es hängt von einem Metadaten-Flag ab, aber wie es im msdn geschrieben ist:

  

Diese Methode hängt von einem optionalen Metadaten-Flag ab. Dieses Flag kann von Compilern eingefügt werden, aber die Compiler sind dazu nicht verpflichtet.

Das bedeutet, dass es vom Compiler abhängt und wenn wir einen anderen Compiler verwenden, können wir erreichen, dass der Parameter, der den Standardwert hat, nicht IsOptional flag hat. Sehen wir uns nun an, wie die HasDefaultValue-Eigenschaft implementiert wurde:

%Vor%

Es prüft immer, ob der Parameter einen Standardwert hat und nicht vom Compiler abhängig ist. Das ist vielleicht keine 100% richtige Antwort, nur meine Gedanken.

UPDATE 0

Hier ist ein Beispiel, in dem der Parameter nicht den Standardwert hat, aber IsOptional ist wahr:

%Vor%     
Vyacheslav Volkov 24.04.2013, 09:03
quelle
3

Danny Chen und vvs0205 geben den Unterschied genau an, dass IsOptional immer compilerabhängig ist und um zu überprüfen, ob der Parameter ein optionaler Parameter ist, dessen Standardwert angegeben ist verwenden Sie HasDefaultValue .

%Vor%

Von hier aufgenommen (< em> Fang einige andere undokumentierte Techniken, um das gleiche in diesem Thread zu bekommen )

    
nawfal 24.04.2013 10:58
quelle
1

Sie können nicht die Schlussfolgerung "sie sind die gleichen" mit "a gleich b; und c gleich d", wie:

%Vor%

Ok zurück zum Thema, aktuell ein optionaler Parameter hat immer einen Standardwert, diese Schlussfolgerung ist "jetzt" richtig. Aber AFAIK ist undokumentiertes Verhalten, was bedeutet, dass der Compiler sein Verhalten / seine Implementierung in optionale Parameter ändern kann. Wenn Sie also (über die Reflektion) überprüfen möchten, ob der Parameter optional ist, verwenden Sie .IsOptional property. Wenn Sie überprüfen wollen, ob es einen Standardwert hat (vielleicht durch ein Attribut wie DefaultValue markiert?), Dann benutzen Sie .HasDefaultValue property. Klingt wie überflüssige Worte, aber es ist wahr.

    
Danny Chen 24.04.2013 08:32
quelle