30

オブジェクト初期化構文を使用してプロパティを設定する順序は、まったく同じ順序で実行されますか?

たとえば、これを行うと:

var s = new Person { FirstName = "Micah",
                     LastName = "Martin",
                     IsLoaded = true
                   }

各プロパティは同じ順序で設定されますか?

4

1 に答える 1

48

はい。

中断してしまったことをお詫びします (私は実際に時々仕事をしなければなりません)。仕様は明示的にそれを述べていませんが、セクション 7.6.10.2 で IMO をかなり明確にしています:


オブジェクト初期化子は、{ および } トークンで囲まれ、コンマで区切られた一連のメンバー初期化子で構成されます。

(ここでは、「セット」ではなく「シーケンス」という言葉に注意してください。シーケンスは順序付けられているため、個人的には重要だと思います。)

次のクラスは、2 つの座標を持つ点を表します。

public class Point
{
    int x, y;
    public int X { get { return x; } set { x = value; } }
    public int Y { get { return y; } set { y = value; } }
}

Point のインスタンスは、次のように作成および初期化できます。

Point a = new Point { X = 0, Y = 1 };

と同じ効果があります

Point __a = new Point();
__a.X = 0;
__a.Y = 1; 
Point a = __a;

ここで、__a は非表示でアクセスできない一時変数です。


編集: Mads Torgersen から返信がありました.彼は基本的に、今できることはすべて秩序を維持すると言っています. 将来、プロパティ/フィールドの設定以外のことをしているという奇妙なケースで順序が保持されないという奇妙なことが起こるかもしれませんが、それは言語がどこに行くかによって異なります。

ここでは、実際には多くのステップが行われていることに注意してください。引数 (つまり、RHS ビット) の評価の実行順序と代入の実行順序があります。たとえば、次の場合:

new Foo
{
    A = X,
    B = Y
}

実際のプロパティ実行の順序 (A および B) を維持しながら、次のすべての順序が可能です。

  • X を評価し、A に割り当て、Y を評価し、B に割り当てます
  • X を評価、Y を評価、A に割り当て、B に割り当て
  • Y を評価、X を評価、A に割り当て、B に割り当て

最初のオプションが実際に採用されたものだと思いますが、これは目に見える以上のものがあることを示すためのものです.

また、これに依存するコードを実際に書くことにも非常に警戒します...

于 2009-01-30T14:16:27.297 に答える