我怎样才能设置结构构造函数中的自动属性支持字段的值?

给定一个像这样的结构:

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;
}

这样做可以调用默认的构造函数,并通过这样做,它初始化所有的字段,从而使this在自定义构造函数引用。


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

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

    该类型应该将其成员公开为字段。 上述要求意味着一个结构体将无法做任何暴露域结构无法做的事情,并且也意味着如果代码没有触及任何线程危险,结构体将能够做任何暴露域结构可以做到,尽管可能更慢并且带有更多的线程风险。

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

    myFoo.f2 = someValue;
    

    只有在法律上可以说的情况下才允许

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

    并且在第一种形式被允许并且第二种形式的行为已经定义了语义的所有情况下,它们将表现相同。 因此,试图“封装” Foo的属性并不能真正完成任何事情,除非使代码更难以编写,不够清晰并且执行速度较慢。

    链接地址: http://www.djcxy.com/p/21055.html

    上一篇: How can I set the value of auto property backing fields in a struct constructor?

    下一篇: What is the difference between uint and System.UInt32?