English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 匿名型

 C# 面向オブジェクト(OOP)

C#では、匿名型は名前を持たない型(クラス)であり、名前は公共の読み取り専用属性のみを含むことができます。フィールド、メソッド、イベントなどの他のメンバーを含むことはできません。

匿名型は、名前を持たない型(クラス)であり、名前は公共の読み取り専用属性のみを含むことができます。フィールド、メソッド、イベントなどの他のメンバーを含むことはできません。

var student = new { Id = 1, FirstName = "James", LastName = "Bond" };

匿名型の例

var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
匿名型のアクセスの例 //Console.WriteLine(student.Id);1
出力 //Console.WriteLine(student.FirstName);
出力:James //Console.WriteLine(student.LastName);
出力:Bond 2student.Id =//student.FirstName = "Steve";
;//student.FirstName = "Steve";

エラー:値を変更できません

var student = new { 
                    Id = 1, 
                    FirstName = "James", 
                    LastName = "Bond",
                    Address = new { Id = 1, City = "London", Country = "UK"
                };

匿名型配列を作成することもできます。

var students = new[] {
            new { Id = 1, FirstName = "James", LastName = "Bond"
            new { Id = 2, FirstName = "Steve", LastName = "Jobs"
            new { Id = 3FirstName = "Bill", LastName = "Gates"
    };

匿名型は定義するメソッドに対して常にローカルです。メソッドから返すことはできません。ただし、匿名型はメソッドにオブジェクト型パラメータとして渡すことができますが、これを推奨しません。別のメソッドに渡す必要がある場合は、匿名型ではなく struct や class を使用してください。

通常、LINQクエリのSelect子句を使用して匿名型を作成し、コレクションの各オブジェクトから属性のサブセットを返します。

class Program
{
    static void Main(string[] args)
    {
        IList<Student> studentList = new List<Student>() { 
            new Student() { StudentID = 1, StudentName = "ジョン", age = 18 },
            new Student() { StudentID = 2, StudentName = "スティーブ", age = 21 },
            new Student() { StudentID = 3, StudentName = "ビル", age = 18 },
            new Student() { StudentID = 4, StudentName = "ラム" , age = 20  },
            new Student() { StudentID = 5, StudentName = "ロン" , 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-ジョン
2-スティーブ
3-ビル
4-ラム
5-ロン

上記の例では、LINQクエリのselect子句はStudentIDとStudentName属性を選択し、それぞれをIdとNameにリネームします。そのため、メモリの節約や不必要なコードの削減に非常に役立ちます。クエリ結果の集合には、以下のデバッグビューのようにStudentIDとStudentName属性のみが含まれています。

Visual Studioは匿名型に対してIntelliSenseをサポートしています。

Visual Studioの匿名型Intellisenseサポート

内部では、すべての匿名型は直接System.Objectクラスから派生しています。コンパイラは自動的に生成された名前を持つクラスを生成し、各属性に適切な型を適用します。それでも、あなたのコードではアクセスできないものですが、GetType()メソッドを使用して名前を確認できます。

例:匿名型の内部名
static void Main(string[] args)
{    
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };    
    Console.WriteLine(student.GetType().ToString());
}