2

最近、コンパイラの警告と (非常に役立つ) ヒントが表示され、以下のコードを書くようになりました。

私はあなたがこれを行うことができるとは思いもしませんでしたが、それは完全に合法であり、管理されていない構造体のパブリック フィールドと同様のパブリック プロパティを持つ管理された構造体を宣言できるという点でも便利です。すべてのフィールドをパラメーターとして。

私を混乱させているのは、これが明示的なパラメーターなしのコンストラクターを呼び出しているように見えることです。これはもちろん、この構造体では違法です。

この構文は常にサポートされていますか?

internal struct IconEntry
{
    public byte Width { get; set; }
    public byte Height { get; set; }
    public byte ColorCount { get; set; }
    public byte Reserved { get; set; }
    public short Planes { get; set; }
    public short BitCount { get; set; }
    public int BytesInRes { get; set; }
    public int ImageOffset { get; set; }

    public IconEntry(BinaryReader reader)
        : this()
    {
        Width = reader.ReadByte();
        Height = reader.ReadByte();
        ColorCount = reader.ReadByte();
        Reserved = reader.ReadByte();
        Planes = reader.ReadInt16();
        BitCount = reader.ReadInt16();
        BytesInRes = reader.ReadInt32();
        ImageOffset = reader.ReadInt32();
    }
}
4

4 に答える 4

0

構造体のフィールドではなくプロパティを公開している理由はありますか? データ型のセマンティクスがそれを暗示している場合

  1. インスタンスの全体的な状態は、一部のパブリック メンバーによって公開された値によって完全に定義されます。そのため、それらすべてが同じ値を報告または含む 2 つのインスタンスは同一と見なされます。
  2. 問題の目的の値が与えられれば、前述のメンバーの値の任意の組み合わせを持つ構造体のインスタンスを簡単に作成できます。

これは、PODS (Plain Old Data Struct) にぴったりのように思えます。公開されたフィールドは、構造体のプロパティよりも効率的で、風変わりではありません。すべての構造体型が、構造体割り当てによる変更またはキャプチャのために常にすべてのフィールドを公開することを考えると、構造体プロパティによって提供されるカプセル化の価値は非常に限られています。

コンストラクターを作成する方法では、構造体のすべてのフィールドがすべてビットゼロに設定され、一度に 1 つのフィールドを目的の値で更新するメソッドに繰り返し渡されます。によってすべてのビットがゼロに初期化されるように構造体が指定されているという事実はthis、コンパイラを満足させますが、多くの個々のプロパティを使用してフィールドを断片的に設定するのは非効率的です。

ちなみに、多くの場合、コンストラクターよりも優れているのは、単に構造体をrefパラメーターとして受け取る静的メソッドです。多くの場合、構造体でコンストラクターを使用すると不要なコピー操作が発生しますが、これはrefパラメーターで静的メソッドを使用することで回避できます。

于 2012-12-05T23:16:55.640 に答える