这是如何评估的,例如,流程是什么,
此:
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()
};
它会不会:
有效地意味着同样的事情,为什么以及如何?
即使没有"a"
被解析,它是否仍会实例化对象并将所有属性值赋予其默认值?
答案 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...