20

给定这样的结构:

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

当然,会生成一个编译器错误,读取The 'this' object cannot be used before its all fields are assigned to

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

4

2 回答 2

45

在 C# 6 之前,您需要在这种情况下使用“this”构造函数:

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

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


编辑:直到 C# 6,这才开始合法;然而,这些天它会更好readonly struct

public readonly struct SomeStruct
{
    public SomeStruct(string stringProperty, int intProperty)
    {
        this.StringProperty = stringProperty;
        this.IntProperty = intProperty;
    }

    public string StringProperty { get; }
    public int IntProperty { get; }
}
于 2009-02-06T21:38:07.117 回答
0

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

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

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

如果一个结构Foo有字段f1and f2,以及一个按该顺序设置这些字段的构造函数,并且 iffooExpr是某种类型的表达式Foo[可能是变量、字段、数组引用、属性或其他],则语句:

myFoo.f2 = someValue;

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

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

并且在允许第一种形式并且第二种形式的行为已定义语义的所有情况下,它们的行为将相同。因此,试图“封装” 的属性Foo并不能真正完成任何事情,只会使代码编写起来更麻烦、不太清晰、执行起来更慢。

于 2013-01-13T04:31:04.023 回答