如何在结构构造函数中设置自动属性支持字段的值?

时间:2009-02-06 21:36:44

标签: c# constructor struct backing-field

给出这样的结构:

public struct SomeStruct
{
    public SomeStruct(String stringProperty, Int32 intProperty)
    {
        this.StringProperty = stringProperty;
        this.IntProperty = intProperty;
    }

    public String StringProperty { get; set; }
    public Int32 IntProperty { get; set; }
}

当然,生成的编译器错误读取在将所有字段分配给之前,不能使用“this”对象。

有没有办法为支持字段或属性本身分配值,还是我必须使用我自己的显式支持字段以老式的方式实现属性?

2 个答案:

答案 0 :(得分:45)

您需要使用“this”构造函数:

public SomeStruct(String stringProperty, Int32 intProperty) : this()
{
    this.StringProperty = stringProperty;
    this.IntProperty = intProperty;
}

这样做会调用默认构造函数,通过这样做,它会初始化所有字段,从而允许在自定义构造函数中引用this

答案 1 :(得分:0)

如果一个结构将会拥有,并且它的用户会期望它具有以下三个特征:

  1. 它的整个状态被封装在一些特定的固定可读成员集中
  2. 可以轻松创建一个实例,其中这些成员具有对其各自类型有效的值的任意组合。
  3. 该类型的默认实例应将所有这些成员设置为其各自类型的默认值。

该类型应将其成员公开为字段。上述要求意味着结构将无法执行外接字段结构无法执行的任何操作,并且还意味着如果代码没有遇到任何线程危险,则结构将能够执行任何暴露字段结构可以做,虽然可能更慢,并且有更多的线程危险。

如果结构Foo包含字段f1f2,并且构造函数按该顺序设置这些字段,并且fooExpr是某种类型的表达式Foo [可能是变量,字段,数组引用,属性或其他]语句:

myFoo.f2 = someValue;

只有在合法说法的情况下才允许

myFoo = new Foo(myFoo.f1, someValue);

并且在允许第一种形式且第二种形式的行为已定义语义的所有情况下,它们的行为都相同。因此,尝试“封装”Foo的属性并没有真正完成任何事情,除了使代码编写更麻烦,更不清晰,执行速度更慢。