До инициализации свойств для инициализации значений по умолчанию для инициализации значений по умолчанию для инициализации не использовались поля поддержки. В C# 6 он использует поля поддержки для инициализации с помощью нового Auto initialization properties.C# 6 Свойство автоинициализации и использование полей подстановки
Мне любопытно, почему до C# 6 IL использует определение свойства для инициализации. Есть ли конкретная причина для этого? или он не применяется должным образом до C# 6?
Перед C# 6,0
public class PropertyInitialization
{
public string First { get; set; }
public string Last { get; set; }
public PropertyInitialization()
{
this.First = "Adam";
this.Last = "Smith";
}
}
Компилятор сгенерированного кода (IL представление)
public class PropertyInitialisation
{
[CompilerGenerated]
private string \u003CFirst\u003Ek__BackingField;
[CompilerGenerated]
private string \u003CLast\u003Ek__BackingField;
public string First
{
get
{
return this.\u003CFirst\u003Ek__BackingField;
}
set
{
this.\u003CFirst\u003Ek__BackingField = value;
}
}
public string Last
{
get
{
return this.\u003CLast\u003Ek__BackingField;
}
set
{
this.\u003CLast\u003Ek__BackingField = value;
}
}
public PropertyInitialisation()
{
base.\u002Ector();
this.First = "Adam";
this.Last = "Smith";
}
}
C# 6
public class AutoPropertyInitialization
{
public string First { get; set; } = "Adam";
public string Last { get; set; } = "Smith";
}
Компилятор сгенерированного кода (IL представление)
public class AutoPropertyInitialization
{
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string \u003CFirst\u003Ek__BackingField;
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string \u003CLast\u003Ek__BackingField;
public string First
{
get
{
return this.\u003CFirst\u003Ek__BackingField;
}
set
{
this.\u003CFirst\u003Ek__BackingField = value;
}
}
public string Last
{
get
{
return this.\u003CLast\u003Ek__BackingField;
}
set
{
this.\u003CLast\u003Ek__BackingField = value;
}
}
public AutoPropertyInitialization()
{
this.\u003CFirst\u003Ek__BackingField = "Adam";
this.\u003CLast\u003Ek__BackingField = "Smith";
base.\u002Ector();
}
}
Не могли бы вы показать нам код C# 5 и/или 6, который привел к этому IL? Ваше первое предложение смущает меня, потому что вы не можете автоматически инициализировать свойство до C# 6 - вам нужно было сделать это в конструкторе вручную. –
Филе должно быть назначено перед ctor с инициализацией autoproperty (spec говорит так). И перед ctor - нет правильного поля инициализации свойства -> это делается в ctor -> использование свойств напрямую приведет к использованию унифицированных полей. – Mafii
Вы должны показать весь фрагмент кода, в основном показать весь класс как как это было в C# 5 и как в C# 6, в противном случае мы можем только догадываться о причине, по которой компилятор ведет себя так, как это, по-видимому, для вас. –