【发布时间】:2017-08-18 05:37:33
【问题描述】:
在回复this post时,我在一些小结构中踢来踢去,意外地遇到了以下内容:
以下结构,使用 int 字段是完全合法的:
struct MyStruct
{
public MyStruct ( int size )
{
this.Size = size; // <-- Legal assignment.
}
public int Size;
}
但是,使用自动属性的以下结构无法编译:
struct MyStruct
{
public MyStruct ( int size )
{
this.Size = size; // <-- Compile-Time Error!
}
public int Size{get; set;}
}
返回的错误是“'this' 对象在其所有字段都分配给之前不能使用”。我知道这是结构的标准过程:必须从结构的构造函数中直接(而不是通过属性的 set 访问器)分配任何属性的支持字段。
一种解决方案是使用显式支持字段:
struct MyStruct
{
public MyStruct(int size)
{
_size = size;
}
private int _size;
public int Size
{
get { return _size; }
set { _size = value; }
}
}
(请注意,VB.NET 不会有这个问题,因为在 VB.NET 中,所有字段在首次创建时都会自动初始化为 0/null/false。)
在 C# 中使用带有结构的自动属性时,这似乎是一个不幸的限制。从概念上考虑,我想知道这是否不是一个合理的地方,允许在结构的构造函数中调用属性集访问器的异常,至少对于自动属性?
这是一个小问题,几乎是边缘情况,但我想知道其他人对此有何看法......
【问题讨论】:
-
C# 中的字段也初始化为 0/null/false。请记住执行此操作的运行时,而不是特定的语言。 ;)
-
不适用于 C# 中的结构字段。对于结构,字段必须由显式构造函数初始化,如果使用隐式无参数构造函数,则由调用者初始化。 VB.NET 没有这个限制,因此,上面的示例在 C# 中无法编译,但在 VB.NET 中也可以正常编译和运行。
标签: c# c#-3.0 struct automatic-properties