【问题标题】:Why does setting the property in the constructor of a struct not work?为什么在结构的构造函数中设置属性不起作用?
【发布时间】:2011-07-06 10:57:13
【问题描述】:

我有以下不允许的代码(以下错误),为什么?

    struct A
    {
        private int b;

        public A(int x)
        {
            B = x;
        }
        public int B
        {
            get { return b; }
            set { b=value; }
        }

    }

我收到以下错误:

“this”对象在其所有字段都被分配之前不能使用 必须在返回控制之前完全分配到字段“Test.x” 给来电者

【问题讨论】:

  • 检查我的回答你会清楚地了解它

标签: c# properties struct


【解决方案1】:

在使用任何方法或属性之前,必须明确分配结构的变量。这里有两种可能的修复方法:

1) 可以显式调用无参构造函数:

public A(int x) : this()
{
    B = x;
}

2) 可以使用字段代替属性:

public A(int x)
{
    b = x;
}

当然,第二个选项仅适用于您当前的形式 - 如果您想将结构更改为使用自动属性,您必须使用第一个选项。

但是,重要的是,您现在有了一个可变结构。这几乎总是一个非常糟糕的主意。我会强烈敦促你改用这样的东西:

struct A
{
    private readonly int b;

    public A(int x)
    {
        b = x;
    }

    public int B { get { return b; } }
}

编辑:有关原始代码为何不起作用的更多详细信息...

来自 C# 规范的第 11.3.8 节:

如果struct实例构造函数没有指定构造函数初始化器,则this变量对应struct类型的out参数

现在最初不会明确分配,这意味着您不能执行 任何 成员函数(包括属性设置器),直到正在构造的结构的所有第一个都已明确分配。编译器不知道或试图考虑属性设置器不尝试从另一个字段读取的事实。这一切都是为了避免读取尚未明确分配的字段。

【讨论】:

  • 嗯,我不明白。设置相同的属性(b=value)和手动设置有什么区别?我仍然不明白为什么 B=x 不起作用。顺便说一句,结构变量是字段还是我应该称它们为变量?
  • @Cocodrilo - 因为在结构完全初始化之前,您不能对结构执行 任何操作,这可以通过调用默认值(并且碰巧是假的)构造函数,或者可以通过显式分配所有字段。在完成之前,您无法访问属性(这是一种方法)。上面的“1”表示第一个选项(构造函数),上面的“2”表示“分配所有字段”选项。
  • @Cocodrilo 和乔恩的第二点;可变结构是非常非常糟糕的魔力。
  • @Cocodrilo:看我的编辑 - 老实说,阅读 C# 规范真的很有用。
  • 好吧,我现在迷路了。可变结构有什么不好?我认为我可以像使用类一样使用它(除了作为值类型)
【解决方案2】:

将您的构造函数更改为:

public A(int x) :
    this()
{
    B = x;
}

至于“为什么”,请参考11.3.8 Constructors5.3 Definite assignment

【讨论】:

  • @Gunner : 此代码将删除此错误如果没有,您将遇到错误,因为在分配其所有字段之前无法使用“this”对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多