0

超簡単な質問...構造体のプライベートバッキングフィールドを適切に初期化するにはどうすればよいですか? コンパイラ エラーが発生します。

自動的に実装されたプロパティ 'Rectangle.Y' のバッキング フィールドは、コントロールが呼び出し元に返される前に完全に割り当てられている必要があります。コンストラクター初期化子から既定のコンストラクターを呼び出すことを検討してください。

ソースコードはこちら。

public struct Rectangle
{    
    public Rectangle(int x, int y, int width, int height)
    {
        X = x; 
        Y = y; 
        Width = width; 
        Height = height;
    }
    public int Width { get; private set; }
    public int Height { get; private set; }
    public int X { get; private set; }
    public int Y { get; private set; }
}
4

3 に答える 3

4

これは、構造体で自動的に実装されたプロパティを使用する際の問題です。パラメーターなしのコンストラクターに明示的にチェーンする必要があります。

public Rectangle(int x, int y, int width, int height) : this()
{
    X = x; 
    Y = y; 
    Width = width; 
    Height = height;
}

コンパイラは、各プロパティを設定すると関連するフィールドが設定されることを「認識」していません。すべてのフィールド (自動生成されているため、明示的にアクセスすることはできません) が割り当てられていることを確認する必要があります。幸いなことに、パラメーターなしのコンストラクターがそれを行います。

個人的には、代わりに実際の読み取り専用フィールドと手動プロパティを使用するだけです。

public struct Rectangle
{    
    private readonly int x, y, width, height;

    public int X { get { return x; } }
    public int Y { get { return y; } }
    public int Width { get { return width; } }
    public int Height{ get { return height; } }

    public Rectangle(int x, int y, int width, int height)
    {
        this.x = x; 
        this.y = y; 
        this.width = width; 
        this.height = height;
    }
}

セッターがコンストラクターでのみ呼び出され、読み取り専用フィールドへの書き込みに直接変換されるように、C# に "本当に" 読み取り専用で自動的に実装されたプロパティを宣言する方法があればいいのにと思いますが、気にしないでください...

于 2013-09-27T21:31:12.873 に答える
1

デフォルトのコンストラクター(バッキングフィールドをデフォルトで初期化し、コンパイラーを満足させる)を連鎖呼び出しすると、そのエラーを回避できます。

public Rectangle(int x, int y, int width, int height)
    : this()
{
    // ...
于 2013-09-27T21:32:04.773 に答える
0

フィールドではなく自動プロパティを使用する特別な理由がない限り、単にパブリック フィールドを使用してください。クラス プロパティは、フィールドができない便利なこと (更新通知のサポートなど) を行うことができます。また、(フィールドではなく) クラス型で自動プロパティを使用すると、後でそのような追加機能が必要になった場合に、実際のプロパティを簡単に使用できるようになります。可変構造プロパティは、クラス プロパティに関連する利点を実際には提供しません。宣言を考えると:

SomeStructure foo,bar;
...
foo = bar;

最後のステートメントは、 のパブリック フィールドとプライベート フィールドのすべての状態をキャプチャし、すべてbarのパブリック フィールドとプライベート フィールドの内容をそれらで上書きしますfooSomeStructure起こりました。構造体のセマンティクスが、メンバーがそれぞれの型に有効な値の任意の組み合わせを保持できるというものである場合、フィールドではなくプロパティを使用すると、いくつかの操作が不便になります (問題の初期化など) が、本質的に保護やその他の利点は提供されません。話すこと。

于 2014-04-04T16:25:19.010 に答える