在回答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/

10-12 12:55
查看更多