0

超简单的问题...如何正确初始化结构上的私有支持字段?我得到一个编译器错误:

在将控制权返回给调用者之前,必须完全分配自动实现的属性“Rectangle.Y”的支持字段。考虑从构造函数初始化器调用默认构造函数。

这里是源代码。

public struct Rectangle
{    
    public Rectangle(int x, int y, int width, int height)
    {
        X = x; 
        Y = y; 
        Width = width; 
        Height = height;
    }
    public int Width { get; private set; }
    public int Height { get; private set; }
    public int X { get; private set; }
    public int Y { get; private set; }
}
4

3 回答 3

4

这是在结构中使用自动实现的属性的问题。您需要显式链接到无参数构造函数:

public Rectangle(int x, int y, int width, int height) : this()
{
    X = x; 
    Y = y; 
    Width = width; 
    Height = height;
}

编译器不“知道”设置每个属性将设置相关字段 - 它需要查看所有字段(您无法显式访问,因为它们是自动生成的)都已分配。幸运的是,无参数构造函数可以为您做到这一点。

就我个人而言,我只会使用真正的只读字段和手动属性,请注意:

public struct Rectangle
{    
    private readonly int x, y, width, height;

    public int X { get { return x; } }
    public int Y { get { return y; } }
    public int Width { get { return width; } }
    public int Height{ get { return height; } }

    public Rectangle(int x, int y, int width, int height)
    {
        this.x = x; 
        this.y = y; 
        this.width = width; 
        this.height = height;
    }
}

我希望 C# 有一种方法可以声明“真正的”只读自动实现的属性,这样设置器只能在构造函数中调用,并且可以直接转换为对只读字段的写入,但没关系......

于 2013-09-27T21:31:12.873 回答
1

如果您链式调用默认构造函数(它将为您默认初始化支持字段,以满足编译器的要求),您可以避免该错误。

public Rectangle(int x, int y, int width, int height)
    : this()
{
    // ...
于 2013-09-27T21:32:04.773 回答
0

除非您有特殊原因使用自动属性而不是字段,否则只需使用公共字段。类属性可以做字段不能做的有用的事情(例如支持更新通知),并且在类类型中使用自动属性(而不是字段)将在以后需要这些额外功能时更容易使用真实属性。可变结构属性并没有真正提供与类属性相关的任何优点。鉴于声明:

SomeStructure foo,bar;
...
foo = bar;

最后一条语句将捕获所有bar公共和私有字段的状态,并用这些覆盖所有foo公共和私有字段的内容,没有任何与SomeStructure有权阻止它甚至知道它有任何相关的代码发生了。如果结构的语义是成员可以保存对其各自类型有效的值的任何组合,则使用属性而不是字段将使某些操作不那么方便(例如有问题的初始化),同时基本上没有保护或其他优势可以说。

于 2014-04-04T16:25:19.010 回答