C# 匿名類型

 在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用于匿名類型,如下所示。

調(diào)試視圖中的匿名類型
Visual Studio中的匿名類型Intellisense支持

在內(nèi)部,所有匿名類型都直接從System.Object類派生。編譯器會(huì)生成一個(gè)具有一些自動(dòng)生成名稱的類,并根據(jù)值表達(dá)式將適當(dāng)?shù)念愋蛻?yīng)用于每個(gè)屬性。盡管您的代碼無法訪問它。使用GetType()方法可以查看名稱。

示例:匿名類型的內(nèi)部名稱
static void Main(string[] args)
{    
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };    
    Console.WriteLine(student.GetType().ToString());
}
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清