C#3.0提供了一个新的语法,对象初始化器(Object Initializers)。 该语法是为了简化一个常见的编程模式:构造一个新对象,逐个设置对象的公共属性。
实例如下:
class Program { static void Main(string[] args) { //对象初始化器 Person p = new Person() { FirstName = "Hello", LastName = "World" }; Console.WriteLine(p); Console.ReadKey(); } } class Person { public string FirstName { get;set; } public string LastName { get;set; } public override string ToString() { return string.Format("{0} {1}", FirstName, LastName); } }
从一开始我就知道这个语法等价于下面的语句:
Person p = new Person(); p.FirstName = "Hello"; p.LastName = "World"; ...
我自然也就认为编译器也会用这样的代码进行替换。偶然一次起了好奇心, 想看看编译器是不是真的这么做的,于是就查看生成的IL,结果真发现了点东西。IL代码我只能看个大概, 下面是在Reflector后的结果(选项设置为C#, .net2.0):
Person <>g__initLocal0 = new Person(); <>g__initLocal0.FirstName = "Hello"; <>g__initLocal0.LastName = "World"; Person p = <>g__initLocal0; Console.WriteLine(p); Console.ReadKey();
多了个局部变量了<>g__initLocal0, 构建的对象完成所有属性设置后再赋值给p。虽然我不理解为什么要加一个"临时变量", 但是这不会影响代码的最终结果。
原本到此就该结束了,但是在好奇心的驱使下又做了一个新的测试。 我把Person的定义改成了struct,这样他就是个值类型了。对象初始化器的语法对值类型依然有效,Reflector的结果没有变化, 但是这个赋值语句的意义就不一样了:
2021年4月12日 21:12
If you set out to make me think today; mission accomplished! I really like your writing style and how you express your ideas. Thank you. 123movies websites