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 all of its 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

構造が持つ予定であり、そのユーザーがそれを期待する場合、次の3つの特性すべてがあります。

  1. その全体の状態は、読み取り可能なメンバーの特定の固定セットにカプセル化されます
  2. これらのメンバーがそれぞれのタイプに有効な値の任意の組み合わせを持つインスタンスを簡単に作成できます。
  3. タイプのデフォルトインスタンスでは、これらのメンバーすべてをそれぞれのタイプのデフォルト値に設定する必要があります。

タイプはそのメンバーをフィールドとして公開する必要があります。上記の要件は、構造体が露出フィールド構造体が実行できないことを実行できないことを意味します。また、コードがスレッドの危険にぶつからない場合、構造体は露出フィールドを実行できることを意味します。構造体は、おそらくより遅く、より多くのスレッドの危険性がありますが、実行できます。

構造体Fooにフィールドf1f2、があり、それらのフィールドをこの順序で設定するコンストラクターがある場合、およびタイプ[おそらく変数、フィールド、配列参照、プロパティなど]のfooExprある種の式である場合、ステートメントは次のようになります。Foo

myFoo.f2 = someValue;

合法的に言うことができる場合にのみ許可されます

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

また、最初の形式が許可され、2番目の形式の動作にセマンティクスが定義されているすべての状況で、それらは同じように動作します。したがって、のプロパティを「カプセル化」しようとしてFooも、コードの記述がより面倒になり、明確さが低下し、実行が遅くなることを除いて、実際には何も達成されません。

于 2013-01-13T04:31:04.023 に答える