1

これはどのように評価されますか、流れはどうですか、

これ:

var tag = new TagBuilder("a");
tag.MergeAttribute("href", pageUrl(i));
tag.InnerHtml = i.ToString();

これに変えることができます:

var tag = new TagBuilder("a")
{
    MergeAttribute("href", pageUrl(i)),
    InnerHtml = i.ToString()
};

それは行きますか:

  1. 新しいオブジェクトをインスタンス化します
  2. 引数を解析して設定します
  3. すべての値をプロパティに割り当てます

それは事実上同じことを意味しますか? なぜ、どのように?

解析されていない場合"a"でも、オブジェクトをインスタンス化し、すべてのプロパティ値にデフォルトを与えるでしょうか?

4

2 に答える 2

2

これは、仕様の §7.6.10.2 オブジェクト初期化子で説明されています。オブジェクト初期化子がどのようにコンパイルされるかを説明する例をそこから引用します。

次のクラスは、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;

where__aは、他の方法では見えず、アクセスできない一時変数です。

于 2013-05-25T15:39:32.313 に答える
1

まず、オブジェクト初期化子でメソッドを呼び出すことはできません。だからあなたはこれを持っているかもしれません:

var tag = new TagBuilder("a")
{
    // MergeAttribute("href", pageUrl(i)), you can not do this
    InnerHtml = i.ToString()
};

@RadimKohlerが言ったように、これはコンパイラによって提供される構文糖衣です。このようなコードを書くと、コンパイル時にコンパイラーが残りの作業を行います。したがって、コンパイラが生成したコードは次のとおりです。

TagBuilder tag = new TagBuilder("a");
tag.InnerHtml = i.ToString();
// the rest of your code...
于 2013-05-25T15:33:44.637 に答える