C#_泛型方法的定义及使用

发布于:2024-12-18 ⋅ 阅读:(56) ⋅ 点赞:(0)

在C#语言中泛型方法是指通过泛型来约束方法中的参数类型,也可以理解为对数据类型设置了参数。

如果没有泛型,每次方法中的参数类型都是固定的,不能随意更改。

在使用泛型后,方法中的数据类型则有指定的泛型来约束,既可以根基提供的泛型来传递不同类型的参数。

泛型向 .NET 引入了类型参数的概念。 泛型支持设计类和方法,你可在在代码中使用该类或方法时,再定义一个或多个类型参数的规范。 例如,通过使用泛型类型参数 T,可以编写其他客户端代码能够使用的单个类,而不会产生运行时转换或装箱操作的成本或风险,如下所示:

// Declare the generic class.
public class GenericList<T>
{
    public void Add(T item) { }
}

public class ExampleClass { }

class TestGenericList
{
    static void Main()
    {
        // Create a list of type int.
        GenericList<int> list1 = new();
        list1.Add(1);

        // Create a list of type string.
        GenericList<string> list2 = new();
        list2.Add("");

        // Create a list of type ExampleClass.
        GenericList<ExampleClass> list3 = new();
        list3.Add(new ExampleClass());
    }
}

泛型方法的定义:

        定义泛型方法需要在方法名和参数列表之间加上 <> ,并在其中使用 T 来代表参数类型。

当然,也可以使用其他的标识符俩代替参数类型,但通常都是用 T 来表示。下面通过实例来演示泛型方法的使用。


定义泛型方法代码比如:

public static void Add1<T>(T a)
{
    Console.WriteLine("张伟" + a);
}

如何调用:

Add1<int>(202072);
Add1<string>("最帅");
Add1<string[]>(new string[] { "张伟", "张伟" });

调用泛型方法格式:<类型>(参数必须是 <> 的类型)


参数多个泛型的时候,如果都是 T ,必须保证参数是同一个类型的

public static void Add2<T>(T a, T b)
{
    Console.WriteLine(a + ":" + b);
}

调用

Add2(120, 110);
Add2("张伟", "最帅");

(注意:调用泛型方法的时候方法名后面的尖括号是需要加的,虽然没加上也没事,但最好还是加上)


// 演示参数是多个不同的泛型类型参数
public static void Add3<T1, T2>(T1 a, T2 b)
{
    Console.WriteLine(a + ":" + b);
}

定义一个泛型方法有几个要求:

  • 在方法名后面加上 <T>

  • 参数是泛型的时候,在参数前面添加 T 必须保证参数是同一个类型


泛型方法是通过类型参数声明的方法,如下所示:

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

如下示例演示使用类型参数的 int 调用方法的一种方式:

public static void TestSwap()
{
    int a = 1;
    int b = 2;

    Swap<int>(ref a, ref b);
    System.Console.WriteLine(a + " " + b);
}

类型推理的相同规则适用于静态方法和实例方法。编译器可基于传入的方法参数推断类型参数;而无法仅根据约束货返回值推断类型参数。因此,类型推理不适用于不具有参数的方法。类型推理发生在编译时,之后编译器尝试解锁重载的方法签名。 编译器将类型推理逻辑应用于共用同一名称的所有泛型方法。 在重载解决方案步骤中,编译器仅包含在其上类型推理成功的泛型方法。

在泛型类中,非泛型方法可访问类级别类型参数,如下所示:

class SampleClass<T>
{
    void Swap(ref T lhs, ref T rhs) { }
}


网站公告

今日签到

点亮在社区的每一天
去签到