匿名类型 和 对象集合初始化器
匿名类型
var KeyPair1 = new { Key="yuyi",Value="Programer"};
在内部自动生成
<>f__AnonymousType0<<Key>j__TPar, <Value>j__TPar>
这个类型是直接继承自System.Object的,并且是internal seald(只在程序集内可见,并且不能被继承)。有心的你也许会发现,这个类型还是一个泛型类型,那么只要我们在使用一个匿名类型的时候参数个数,参数名称不发生变化,编译器是不会为我们产生更多的类型的
对象集合初始化器
类似的
Book book = new Book { Title="Inside COM",ISBN="123-456-789"}; Book b = new Book { Title = "Inside COM", ISBN = "123-456-789" }; Book bb = new Book("aa") { Title = "Inside COM", ISBN = "123-456-789" }; Console.Read(); List<Book> ListBook = new List<Book> { new Book("aa"){ Title = "Inside COM", ISBN = "123-456-789" },new Book("aa","bb"){ Title = "aaa", ISBN = "aaa" }}; Dictionary<int, string> dicResult = new Dictionary<int, string> { {0, "11"}, {1, "图片大小超过限制"}, {2, "上传图片异常"}, {3, "上传图片成功"} }; List<Book> ListBook = new List<Book> { { Title = "Inside COM", ISBN = "123-456-789" } };
对象初始化器 也会在内部自动生成一些代码
Book book = new Book(); book.Title = "Inside COM"; book.ISBN = "123-456-789"; Book book = new Book("aa"); book.Title = "Inside COM"; book.ISBN = "123-456-789";
等等
不过 new List<Book> { { Title = "Inside COM", ISBN = "123-456-789" } }; 会报错 而
new Dictionary<int, string> { {0, "11"},{1, "图片大小超过限制"}, }; 不会报错
是因为
Dictionary<int, string> dicResult = new Dictionary<int, string> { {0, "11"}, {1, "图片大小超过限制"}, {2, "上传图片异常"}, {3, "上传图片成功"} }; 生成的IL 是 Dictionary<int, string> <>g__initLocal0 = new Dictionary<int, string>(); <>g__initLocal0.Add(0, "11"); <>g__initLocal0.Add(1, "图片大小超过限制"); <>g__initLocal0.Add(2, "上传图片异常"); <>g__initLocal0.Add(3, "上传图片成功"); Dictionary<int, string> dicResult = <>g__initLocal0;
最后啰嗦一句。
匿名类型 和 对象集合初始化器 代码层次上的区别是 new 和 new 对象的区别