Я всегда могу найти законные дискуссии о возможностях C #, и почти всегда есть свои плюсы и минусы, но в этом случае я действительно не смог найти никого, кто бы рекомендовал использовать автоматически реализуемые свойства.
Я столкнулся с этим вопросом сегодня во время проверки кода, и когда я спросил у своих коллег, мы также не смогли прийти к консенсусу. Мне не нравится двусмысленность, и я хотел знать хотя бы один животрепещущий вопрос, который отвечал бы на ваш вопрос:
- Есть ли прирост производительности или поражение при использовании одного способа по сравнению с другим?
Подобно тому, как выяснять, сколько движений нужно, чтобы добраться до центра Tootsie Roll Tootsie Pop, я решил: «давай узнаем».
Давайте сначала действительно сравним яблоки с яблоками.
Предположим, у нас есть два класса:
public class C
{
private int z;
public int Z
{
get { return z;}
}
}
public class Q
{
public int Z { get; }
}
Первый класс - это резервное хранилище вручную, второй - версия, созданная автоматическим компилятором.
Давайте посмотрим на IL, сгенерированный для каждого.
Во-первых, версия ручного резервного хранилища:
// Fields
.field private int32 z
// Methods
.method public hidebysig specialname
instance int32 get_Z () cil managed
{
// Method begins at RVA 0x2050
// Code size 12 (0xc)
.maxstack 1
.locals init (
[0] int32
)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldfld int32 C::z
IL_0007: stloc.0
IL_0008: br.s IL_000a
IL_000a: ldloc.0
IL_000b: ret
} // end of method C::get_Z
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2068
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System.Private.CoreLib]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method C::.ctor
// Properties
.property instance int32 Z()
{
.get instance int32 C::get_Z()
}
Теперь посмотрим на IL для второго класса:
// Fields
.field private initonly int32 '<Z>k__BackingField'
.custom instance void [System.Private.CoreLib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
01 00 00 00
)
.custom instance void [System.Private.CoreLib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [System.Private.CoreLib]System.Diagnostics.DebuggerBrowsableState) = (
01 00 00 00 00 00 00 00
)
// Methods
.method public hidebysig specialname
instance int32 get_Z () cil managed
{
.custom instance void [System.Private.CoreLib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
01 00 00 00
)
// Method begins at RVA 0x2071
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld int32 Q::'<Z>k__BackingField'
IL_0006: ret
} // end of method Q::get_Z
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2068
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System.Private.CoreLib]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method Q::.ctor
// Properties
.property instance int32 Z()
{
.get instance int32 Q::get_Z()
}
Игнорируя дополнительный сгенерированный компилятором код для добавления отлаживаемых атрибутов, которые не добавляют заметного исполняемого кода, похоже, нет какой-либо разницы в сгенерированном коде.
Вы можете возразить, что на ваш вопрос нет ответа, но подумайте ...
Если вы когда-либо кодировали свойства, участвующие в привязке, например:
private string name;
public string Name
{
get { return name; }
set { SetProperty (ref name, value);
}
Тогда резервный магазин - это то, что вам нужно.
С другой стороны, использование ярлыка "prop" ‹TAB> ‹TAB> в редакторе Visual Studio для создания автоматических свойств просто супер удобно и намного быстрее, чем all strong> что печатать;)
Так что в итоге для молотка все похоже на гвоздь. Не будь молотком.
person
Stacy Dudovitz
schedule
31.10.2019
might
придется это сделать. Зачем тратить время на то, что подвержено ошибкам (вы, вероятно, все равно будете копировать и вставлять), если вы можете делать это только тогда, когда это необходимо? - person Rob   schedule 14.11.2011prop
и нажать вкладку. Это приводит к автоматически реализуемому свойству. - person cwharris   schedule 14.11.2011