【发布时间】:2017-02-11 22:24:56
【问题描述】:
在 C# 6 之前,属性的初始化不使用支持字段来初始化默认值。 在 C#6 中,它使用支持字段来初始化新的Auto initialization properties。
我很好奇为什么在 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();
}
}
【问题讨论】:
-
您能否向我们展示导致此 IL 的 C# 5 和/或 6 代码?您的第一句话让我感到困惑,因为您无法在 C#6 之前自动初始化属性 - 您必须在构造函数中手动完成。
-
必须在具有自动属性初始化的 ctor 之前分配文件(规范是这样说的)。在 ctor 之前 - 没有正确初始化属性支持字段 -> 这是在 ctor 中完成的 -> 直接使用属性将导致使用未初始化的文件
-
你必须显示整段代码,基本上显示整个类,无论是在 C# 5 中还是在 C# 6 中,否则我们只能猜测编译器行为的原因它显然对你有用。
-
@LasseV.Karlsen 不需要。海事组织很安静,很清楚他在说什么。他的“IL 代码”不是 IL 代码,而是逻辑上代表 IL 的 C# 代码;)
-
是的,但正如已经评论的那样,在 C# 6 之前,您无法自动初始化属性,您可以使用字段初始化,或者将特定代码放入构造函数中以将值分配给属性,后者其中将产生第一个代码示例。因此,谈论“C# 6 之前的自动属性初始化”颇具误导性。我完全理解他所展示的代码,但我希望他能具体说明他的问题。
标签: c# .net c#-6.0 intermediate-language