1中的实例化和属性设置

时间:2013-05-25 15:04:16

标签: c# asp.net-mvc

这是如何评估的,例如,流程是什么,

此:

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. 将所有值分配给属性
  4. 有效地意味着同样的事情,为什么以及如何?

    即使没有"a"被解析,它是否仍会实例化对象并将所有属性值赋予其默认值?

2 个答案:

答案 0 :(得分:2)

这在说明书的§7.6.10.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是一个不可见且无法访问的临时文件   变量

答案 1 :(得分: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...