在C#中,匿名類型是沒有任何名稱的類型(類),該名稱只能包含公共只讀屬性。它不能包含其他成員,例如字段,方法,事件等。
使用帶有對象初始化器語法的 new 運(yùn)算符創(chuàng)建匿名類型。隱式類型變量 var 用于保存匿名類型的引用。
下面的示例演示如何創(chuàng)建一個(gè)匿名類型變量student包含名為三個(gè)屬性 Id,F(xiàn)irstName和LastName。
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
匿名類型的屬性是只讀的,不能使用null,匿名函數(shù)或指針類型進(jìn)行初始化??梢允褂命c(diǎn)(.)表示法訪問這些屬性,與對象屬性相同。但是,您不能更改屬性的值,因?yàn)樗鼈兪侵蛔x的。
var student = new { Id = 1, FirstName = "James", LastName = "Bond" }; Console.WriteLine(student.Id); //輸出1 Console.WriteLine(student.FirstName); //輸出:James Console.WriteLine(student.LastName); //輸出:Bond student.Id = 2;//錯(cuò)誤:無法更改值 student.FirstName = "Steve";//錯(cuò)誤:無法更改值
匿名類型的屬性可以包括另一個(gè)匿名類型。
var student = new { Id = 1, FirstName = "James", LastName = "Bond", Address = new { Id = 1, City = "London", Country = "UK" } };
您也可以創(chuàng)建一個(gè)匿名類型數(shù)組。
var students = new[] { new { Id = 1, FirstName = "James", LastName = "Bond" }, new { Id = 2, FirstName = "Steve", LastName = "Jobs" }, new { Id = 3, FirstName = "Bill", LastName = "Gates" } };
匿名類型對于定義它的方法始終是本地的。無法從方法返回。但是,匿名類型可以作為對象類型參數(shù)傳遞給方法,但不建議這樣做。如果需要將其傳遞給另一個(gè)方法,請使用 struct 或 class 而不是匿名類型。
通常,使用LINQ查詢的Select子句創(chuàng)建匿名類型,以從集合中的每個(gè)對象返回屬性的子集。
class Program { static void Main(string[] args) { IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", age = 18 }, new Student() { StudentID = 2, StudentName = "Steve", age = 21 }, new Student() { StudentID = 3, StudentName = "Bill", age = 18 }, new Student() { StudentID = 4, StudentName = "Ram" , age = 20 }, new Student() { StudentID = 5, StudentName = "Ron" , age = 21 } }; var students = from s in studentList select new { Id = s.StudentID, Name = s.StudentName }; foreach(var stud in students) Console.WriteLine(stud.Id + "-" + stud.Name); } } public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public int age { get; set; } }
1-John 2-Steve 3-Bill 4-Ram 5-Ron
在上面的示例中,LINQ查詢中的select子句僅選擇StudentID和StudentName屬性,并將其分別重命名為Id和Name。因此,在節(jié)省內(nèi)存和不必要的代碼方面很有用。查詢結(jié)果集合僅包含StudentID和StudentName屬性,如以下調(diào)試視圖所示。
Visual Studio支持IntelliSense用于匿名類型,如下所示。
在內(nèi)部,所有匿名類型都直接從System.Object類派生。編譯器會(huì)生成一個(gè)具有一些自動(dòng)生成名稱的類,并根據(jù)值表達(dá)式將適當(dāng)?shù)念愋蛻?yīng)用于每個(gè)屬性。盡管您的代碼無法訪問它。使用GetType()方法可以查看名稱。
static void Main(string[] args) { var student = new { Id = 1, FirstName = "James", LastName = "Bond" }; Console.WriteLine(student.GetType().ToString()); }