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

给出这样的结构:

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”对象在分配所有字段之前无法使用

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

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

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

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

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

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

该类型应将其成员公开为字段。 上面的要求意味着一个struct不能做暴露字段结构不能做的任何事情,并且也意味着如果代码没有遇到任何线程危险,struct将能够做任何暴露字段的事情结构可以做,虽然可能更慢,并有更多的线程危险。

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

 myFoo.f2 = someValue; 

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

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

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