理解 匿名型別
本質上來說,匿名型別其實也是一個引用型別,通常用 var 來接這個引用,在匿名型別中可以定義一個或者多個屬性,不過這些屬性在匿名型別中會被自動做成 只讀屬性
,和傳統的的 class 相比,匿名型別中不能定義 欄位,方法,只能包含只讀屬性。
現在來研究一下具體程式碼,考慮如下的匿名型別。
var author = new{ FirstName = "Joydip", LastName = "Kanjilal", Address = "Hyderabad, INDIA"};
在上面的程式碼中,author 就是匿名型別的例項,這個匿名型別中包含三個屬性: FirstName,LastName,Address,可以看出這些屬性都是 string 型別,有一點挺特別的,在給屬性賦值之前你不必給該屬性定義型別。
下面的程式碼段展示瞭如何輸出這個匿名型別的三個屬性。
Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName);Console.WriteLine("Address: {0}", author.Address);
內嵌匿名型別
匿名型別除了平級定義,還可以巢狀定義,做法就是,在一個匿名型別的屬性中再設定一個匿名型別,下面的程式碼展示了這種情況。
var author = new{ FirstName = "Joydip", LastName = "Kanjilal", Address = new { City = "Hyderabad", Country = "INDIA"}};
接下來看一下如何去訪問巢狀匿名型別中的屬性。
Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName);Console.WriteLine("Address: {0}", author.Address.City);
完整的程式碼如下,可供參考。
static void Main(string[] args){ var author = new { FirstName = "Joydip", LastName = "Kanjilal", Address = new { City = "Hyderabad", Country = "INDIA"} }; Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName); Console.WriteLine("Address: {0}", author.Address.City); Console.Read();}
LINQ 中使用 匿名型別
LINQ 中的 Select 短語常常使用 匿名型別 來生成一個匿名型別集合。
考慮下面的 Author 類。
public class Author{ public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; }}
下面的程式碼片段展示瞭如何生成 authors 集合。
IList<Author> authors =new List<Author>(){ new Author() { Id = 1, FirstName = "John", LastName = "Willey"} , new Author() { Id = 2, FirstName = "Steve", LastName = "Smith"} , new Author() { Id = 3, FirstName = "Bill", LastName = "Ruffner"} , new Author() { Id = 4, FirstName = "Joydip", LastName = "Kanjilal" }};
下面的程式碼片段展示瞭如何利用 Linq.Select + 匿名型別 來返回這個 執行查詢,這是什麼意思呢? 就是說這個 result 是一個 IEnumerable 介面,結果只是一個執行計劃,還沒有被真正執行。
var result = from a in authors select new{ Id = a.Id, Name = a.FirstName + "\t"+ a.LastName};
如果想看到最後的執行結果,可以使用如下程式碼段:
foreach (var data in result) Console.WriteLine(data.Name);
下面是可供參考的完整程式碼。
public class Author { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } class Program { static void Main(string[] args) { IList<Author> authors = new List<Author>() { new Author() { Id = 1, FirstName = "John", LastName = "Willey"}, new Author() { Id = 2, FirstName = "Steve", LastName = "Smith"}, new Author() { Id = 3, FirstName = "Bill", LastName = "Ruffner"}, new Author() { Id = 4, FirstName = "Joydip", LastName = "Kanjilal"} }; var result = from a in authors select new { Id = a.Id, Name = a.FirstName + "\t" + a.LastName }; foreach (var data in result) Console.WriteLine(data.Name); Console.Read(); } }
匿名型別允許你建立一個型別並且可以在事前不定義型別的情況下快速的初始化它,從 CLR 的角度看,匿名型別 也是一個引用型別,編譯器在編譯時,會給 每一個匿名型別 賦予一個 明確的名字。
匿名型別是繼承於 Object 的,這就是為什麼匿名型別只能轉成 Object 的原因,還有一點要注意,方法,屬性,事件,委託 的返回值不可以是匿名型別。