猿教程 Logo

C# 泛型

在C#2.0中引入泛型。 泛型允许您使用占位符来定义其字段,方法,参数等类型的类。通用在编译时用一些特定类型替换这些占位符。

通用类可以使用尖括号<>定义。 例如,以下是具有通用成员变量,通用方法和属性的简单泛型类。

相关实例:

class MyGenericClass<T>
{
    private T genericMemberVariable;

    public MyGenericClass(T value)
    {
        genericMemberVariable = value;
    }

    public T genericMethod(T genericParameter)
    {
        Console.WriteLine("Parameter type: {0}, value: {1}", typeof(T).ToString(),genericParameter);
        Console.WriteLine("Return type: {0}, value: {1}", typeof(T).ToString(), genericMemberVariable);
            
        return genericMemberVariable;
    }

    public T genericProperty { get; set; }
}

正如你在上面的代码中可以看到的,MyGenericClass用<T>定义。 <>表示MyGenericClass是通用的,底层类型将在稍后定义,现在将其视为T. 你可以取任何字符或词,而不是T.

现在,编译器在实例化类时,根据调用者传递的类型分配类型。 例如,以下代码使用int数据类型:

MyGenericClass<int> intGenericClass = new MyGenericClass<int>(10);

int val = intGenericClass.genericMethod(200);

运行结果:

Parameter type: int, value: 200 
Return type: int, value: 10

下图说明了编译器将如何用MyGenericClass中的int替换T.


上面的MyGenericClass <int>类将被编译,如下所示。

相关实例:

class MyGenericClass
{
    private int genericMemberVariable;

    public MyGenericClass(int value)
    {
        genericMemberVariable = value;
    }

    public int genericMethod(int genericParameter)
    {
        Console.WriteLine("Parameter type: {0}, value: {1}", typeof(int).ToString(), genericParameter);
        Console.WriteLine("Return type: {0}, value: {1}", typeof(int).ToString(), genericMemberVariable);

        return genericMemberVariable;
    }

    public int genericProperty { get; set; }

}

您可以在实例化通用类时使用任何类型。 例如,以下示例使用字符串类型。

相关实例:

MyGenericClass<string> strGenericClass = new MyGenericClass<string>("Hello Generic World");

strGenericClass.genericProperty = "This is a generic property example.";
string result = strGenericClass.genericMethod("Generic Parameter");

运行结果:

Parameter type: string, value: Generic Parameter 
Return type: string, value: Hello Generic World

泛型基类

当从泛型基类派生时,必须提供一个类型参数,而不是基类的泛型类型参数,如下所示。

相关实例:

class MyDerivedClass : MyGenericClass<string>
{ 
    //implementation
}

如果你想让派生类是通用的,那么不需要为通用基类指定类型。

相关实例:

class MyDerivedClass<U> : MyGenericClass<U>
{ 
    //implementation
}

如果通用基类具有约束,则派生类必须使用相同的约束。

相关实例:

class MyGenericClass<T> where T: class 
{
        // Implementation 
}

class MyDerivedClass<U> : MyGenericClass<U> where U: class
{ 
        //implementation
}

泛型委托

正如你在上一节已经学到的,委托定义了它可以调用的方法的签名。 通用委托可以与委托相同的方式定义,但是具有通用类型。

例如,考虑以下通用委托,它需要两个通用参数。

相关实例:

class Program
{
    public delegate T add<T>(T param1, T param2);

    static void Main(string[] args)
    {
        add<int> sum = AddNumber;

        Console.WriteLine(sum(10, 20));

        add<string> conct = Concate;

        Console.WriteLine(conct("Hello","World!!"));
    }

    public static int AddNumber(int val1, int val2)
    {
        return val1 + val2;
    }

    public static string Concate(string str1, string str2)
    {
        return str1 + str2;
    }
}

运行结果:

30 
Hello World!!

在上面的例子中,add delegate是通用的。 在Main()方法中,它定义了int类型变量sum的add delegate。 因此它可以指向具有int类型参数的AddNumber()方法。 add delegate的另一个变量使用字符串类型,因此它可以指向Concate方法。 这样,您可以对不同类型的参数的不同方法使用通用委托。

重点

通用委托可以指向具有不同参数类型的方法。 但是,参数的数量应该相同。

泛型可以应用于以下:

  • 接口

  • 抽象类

  • 方法

  • 静态方法

  • 属性

  • 事件

  • Delegates

  • Operator


泛型的优点

  1. 提高代码的可重用性。

  2. 泛型是类型安全。 如果尝试使用与定义中指定的数据不同类型的数据,则会出现编译时错误。

  3. 泛型具有性能优势,因为它消除了装箱和取消装箱的可能性。


更多泛型的资料

泛型的优点和局限性。

通用委托。

重点
  1. 泛型的表示带尖括号<>。

  2. 编译器在编译时对泛型应用指定的类型。

  3. 泛型可以应用于接口,抽象类,方法,静态方法,属性,事件,委托和运算符。

  4. 通过不做装箱和拆箱,通用运行速度更快。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/Csharp-Generics.html