如何在结构构造函数中设置自动属性支持字段的值?
给出这样的结构:
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; }
这样做会调用默认构造函数,通过这样做,它会初始化所有字段,从而允许在自定义构造函数中引用它。
如果一个结构将具有,并且其用户将期望它具有以下所有三个特征:
- 它的整个状态被封装在一些特定的固定可读成员集中
- 可以容易地创建一个实例,其中这些成员具有对其各自类型有效的值的任何组合。
- 该类型的默认实例应将所有这些成员设置为其各自类型的默认值。
该类型应将其成员公开为字段。 上面的要求意味着一个struct不能做暴露字段结构不能做的任何事情,并且也意味着如果代码没有遇到任何线程危险,struct将能够做任何暴露字段的事情结构可以做,虽然可能更慢,并有更多的线程危险。
如果struct Foo
有字段f1
和f2
,以及fooExpr
顺序设置这些字段的构造函数,并且fooExpr
是某种Foo
类型的表达式[可能是变量,字段,数组引用,属性或其他]语句:
myFoo.f2 = someValue;
只有在可以合法说出的情况下才允许
myFoo = new Foo(myFoo.f1, someValue);
并且在允许第一种forms并且第二种forms的行为已经定义语义的所有情况下,它们的行为都相同。 因此,尝试“封装” Foo
的属性并没有真正完成任何事情,除了使代码编写更麻烦,更不清晰,执行速度更慢。