📜  什么是C#中的匿名类型?

📅  最后修改于: 2021-05-29 21:49:21             🧑  作者: Mango

C#中的匿名类型是没有名称的类型,或者您可以说创建新类型而不定义它们。它是在C#3.0中引入的。它是一种临时数据类型,根据您插入对象初始化程序中的数据来推断。换句话说,匿名类型提供了一种有效的方式来将一组只读组合为一个没有任何显式类型的对象。匿名类型的类型由编译器根据分配给其属性的值自动生成。这些最适合“使用和抛出”类型。

C形中的匿名类型

在上图中,我们通过将“ new ”关键字与对象初始化程序一起使用来创建匿名类型。

重要事项:

  • 它派生自System.Object类,它也是一个密封的类。因此,匿名类型的属性是只读的,这意味着您无法更改它们的值。
  • 它还在Visual Studio中具有智能感知支持。
  • 它可以包含一个或多个只读属性。
  • 它不包含类成员,例如事件,方法等。
  • 用于初始化属性的表达式不能为null,匿名方法或指针类型。
  • 您还可以创建一个匿名类型数组。
  • 除对象外,不能将其强制转换为任何其他类型。
  • 它是参考类型。
  • 不允许创建字段,属性,事件或方法的返回类型为匿名类型。
  • 不允许将方法,属性,构造函数,索引器的形式参数声明为匿名类型。
  • 匿名类型的范围始终限于定义它们的方法。由于它们的本地作用域,不允许将匿名类型传递给另一个方法,但是可以将其传递给那些可以接受动态类型参数的方法。如下例所示。

    注意:通常,不建议使用动态类型传递匿名类型。

    例子:

    // C# program to illustrate how a 
    // method accept anonymous type as 
    // a parameter using dynamic type
    using System;
      
    public class GFG {
      
        // Anonymous type object is passed in the 
        // method which has dynamic type parameters
        static public void mymethod(dynamic val)
        {
            Console.WriteLine(val.s_id);
            Console.WriteLine(val.s_name);
            Console.WriteLine(val.language);
        }
      
        // Main method
        static public void Main()
        {
      
            // Anonymous type object
            var anony_object = new {s_id = 134, 
                                    s_name = "Siya", 
                                 language = "Ruby"};
      
            // Calling mymethod
            mymethod(anony_object);
        }
    }
    

    输出:

    134
    Siya
    Ruby
    

在C#中,允许使用不带类定义的新关键字创建匿名类型对象,并且var用于保存匿名类型的引用。如下例所示, anony_object是一个匿名类型对象,其中包含s_ids_namelanguage三个属性。

例子:

// C# program to illustrate the
// concept of anonymous types
using System;
  
public class GFG {
  
    // Main method
    static public void Main()
    {
  
        // Creating and initializing anonymous object
        var anony_object = new {s_id = 109,
                                s_name = "Sohan", 
                               language = "C#" };
  
        // Accessing the object properties
        Console.WriteLine("Student id: " + anony_object.s_id);
        Console.WriteLine("Student name: " + anony_object.s_name);
        Console.WriteLine("Language: " + anony_object.language);
    }
}
输出:
Student id: 109
Student name: Sohan
Language: C#

嵌套匿名类型

在C#中,匿名类型可以将另一个匿名类型作为属性。嵌套的匿名类型在Visual Studio中具有IntelliSense支持。如下例所示, anony_object是一个匿名类型对象,其中包含另一个匿名类型对象anony_ob

例子:

// C# program to illustrate the concept
// of nested anonymous types
using System;
  
public class GFG {
  
    // Main method
    static public void Main()
    {
  
        // Creating and initializing nested anonymous object
        var anony_object = new {s_id = 149, s_name = "Soniya", language = "C#",
                                anony_ob = new { email = "soniya45@gmail.com"}};
  
        // Accessing the object properties
        Console.WriteLine("Student id: " + anony_object.s_id);
        Console.WriteLine("Student name: " + anony_object.s_name);
        Console.WriteLine("Language: " + anony_object.language);
        Console.WriteLine("Email: " + anony_object.anony_ob.email);
    }
}
输出:
Student id: 149
Student name: Soniya
Language: C#
Email: soniya45@gmail.com

LINQ中的匿名类型

允许您在LINQ中使用匿名类型。在LINQ中, select子句生成匿名类型,以便在查询中可以包括未在类中定义的属性。如下例所示,Geeks类包含四个属性,分别是A_no,Aname,language和age。但是结果是我们只需要A_noAnamelanguage ,所以我们使用选择查询来创建一个仅包含A_no,Aname和language的匿名类型的结果。

例子:

// C# program to illustrate the 
// concept of anonymous type in LINQ
using System;
using System.Collections.Generic;
using System.Linq;
  
class Geeks {
  
    public int A_no;
    public string Aname;
    public string language;
    public int age;
}
  
class GFG {
  
    // Main method
    static void Main()
    {
        List g = new List 
        {
  
            new Geeks{ A_no = 123, Aname = "Shilpa",
                        language = "C#", age = 23 },
            new Geeks{ A_no = 124, Aname = "Shilpi",
                        language = "C#", age = 20 },
            new Geeks{ A_no = 125, Aname = "Soniya", 
                        language = "C#", age = 22 },
            new Geeks{ A_no = 126, Aname = "Sonaly", 
                        language = "C#", age = 25 },
  
        };
  
        // select query showing result
        // using anonymous type
        var anony_ob = from geek in g select new {geek.A_no, geek.Aname, geek.language};
        foreach(var i in anony_ob)
        {
            Console.WriteLine("Author id = " + i.A_no + "\nAuthor name = " 
                                 + i.Aname + "\nLanguage = " + i.language);
            Console.WriteLine();
        }
    }
}
输出:
Author id = 123
Author name = Shilpa
Language = C#

Author id = 124
Author name = Shilpi
Language = C#

Author id = 125
Author name = Soniya
Language = C#

Author id = 126
Author name = Sonaly
Language = C#