在回答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;}
}
返回的错误是“在将其所有字段分配给该对象之前,无法使用'此'对象”。我知道这是结构的标准过程:任何属性的后备字段都必须从结构的构造函数中直接分配(而不是通过属性的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#中对结构使用自动属性时,这似乎是一个不幸的限制。从概念上进行思考,我想知道是否存在一个异常(exception),该异常(exception)允许在结构的构造函数中(至少对于自动属性)调用属性集访问器,这是否不是一个合理的地方?
这是一个小问题,几乎是一个极端情况,但是我想知道其他人对此有何看法...
最佳答案
从C#6开始:这不再是问题
从C#6开始,您需要调用默认的构造函数才能使其工作:
public MyStruct(int size) : this()
{
Size = size;
}
这里更大的问题是您具有可变的结构。这是绝不是的好主意。我会做到的:
public int Size { get; private set; }
从技术上讲不是一成不变的,但足够接近。
使用最新版本的C#,您可以在以下方面进行改进:
public int Size { get; }
现在只能在构造函数中分配它。
关于c# - 自动属性和结构不混合?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/420433/