10

次のC#コードについて疑問に思っています。

struct Structure
{
    public Structure(int a, int b)
    {
        PropertyA = a;
        PropertyB = b;
    }
    public int PropertyA { get; set; }
    public int PropertyB { get; set; }
}

「すべてのフィールドが割り当てられるまで、「this」オブジェクトは使用できません」というエラーでコンパイルされていません。類似のクラスの場合、問題なくコンパイルされています。

次のようにリファクタリングすることで機能させることができます。

struct Structure
{
    private int _propertyA;
    private int _propertyB;

    public Structure(int a, int b)
    {
        _propertyA = a;
        _propertyB = b;
    }

    public int PropertyA
    {
        get { return _propertyA; }
        set { _propertyA = value; }
    }

    public int PropertyB
    {
        get { return _propertyB; }
        set { _propertyB = value; }
    }
}

しかし、C#に自動プロパティを導入することの全体的なポイントは、後のコードを記述しないようにすることでした。これは、自動プロパティが構造体に関連していないことを意味しますか?

4

3 に答える 3

21

C# 6 では、これは単純になくなります。問題のコードは正常にコンパイルされます。


ステファンは質問に答えるよりも答えを持っていますが、可変構造体を使用しないようにアドバイスする必要があります-それはあなたを噛むでしょう. 可変構造体は悪です。

IMO、ここでの「正しい」修正は単純です:

struct Structure
{
    public Structure(int a, int b)
    {
        propertyA = a;
        propertyB = b;
    }
    private readonly int propertyA, propertyB;
    public int PropertyA { get { return propertyA; } }
    public int PropertyB { get { return propertyB; } }
}
于 2011-02-17T13:03:03.493 に答える
8

見てきたように、コンストラクターで を参照するときPropertyAは、オブジェクトにアクセスしていthisますが、フィールドがまだ初期化されていないため、コンパイラーはこれを許可しません。

これを回避するには、フィールドを初期化する方法を見つける必要があります。1つの方法はあなたの例です:自動プロパティを使用しない場合、フィールドは明示的であり、それらを初期化できます。

もう 1 つの方法は、フィールドを初期化する別のコンストラクターをコンストラクターで呼び出すことです。構造体には、フィールドをゼロに初期化するパラメーターなしのコンストラクターが常に暗黙的に含まれているため、次のように使用します。

public Structure(int a, int b)
    : this()
{
    PropertyA = a;
    PropertyB = b;
}
于 2011-02-17T13:01:31.963 に答える