Nein, die beiden Setter sind identisch.
Die beste Möglichkeit, dies zu überprüfen, ist die IL, die für die beiden Varianten generiert wurde. Ich kompilierte einen kleinen Test mit den folgenden zwei Eigenschaften:
public int Prop { get; protected set; }
protected int Prop2 { get; set; }
Und dann zerlegte ich es. Die IL ist identisch für die Einrichter für beide Eigenschaften, für den Unterschied in ihren Namen speichern (Prop
vs Prop2
):
.method family hidebysig specialname instance void
set_Prop(int32 'value') cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (01 00 00 00)
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld int32 ConsoleApplication1.Program::'<Prop>k__BackingField'
IL_0007: ret
} // end of method Program::set_Prop
.method family hidebysig specialname instance void
set_Prop2(int32 'value') cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (01 00 00 00)
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld int32 ConsoleApplication1.Program::'<Prop2>k__BackingField'
IL_0007: ret
} // end of method Program::set_Prop2
Wenn die Methode der Öffentlichkeit, wäre es mit public
an die annotiert werden oben, in der Liste method attributes, die nach .method
kommen. Ähnlich, wenn es private
wäre. In diesem Fall sind beide einfach protected
, was mit family
bezeichnet ist.
Ich würde sagen, dass dies mit den Erwartungen übereinstimmt: beide Setter haben identische Sichtbarkeiten, so dass sie mit dem Compiler und Laufzeitumgebung identisch erscheinen sollten.
Warum sollten Sie erwarten, dass es anders ist? Verhält sich der Setter * in irgendeiner Weise anders? –
Ich schreibe ein kleines Assembly Inspection Tool, das die Sichtbarkeit von Eigenschaften genau anzeigen soll. –
Vielleicht prüfen Sie auch den * Getter * und überprüfen * es ist * Schutzstufe. –