概述

+ 概述
  1. 泛型(generic) 特性可以让多个类型共享一组代码。泛型允许我们声明类型参数化(type-parameterized)的代码,用不同的类型进行实例化.即我们可以用“类型占位符”来写代码, 然后在创建类的实例时指明真实的类型.
  2. C# 提供了 5 种泛型:类、结构、接口、委托和方法。类, 结构, 接口, 委托是类型, 而方法是成员.

泛型类

概述

泛型类示例

+ 泛型类示例
using System;
// 声明泛型类
// T: 类型参数(类型占位符).
class MyStack<T>
{
    T[] StackArray;
    int StackPointer = 0;
    public void Push(T x)
    {
        if (!IsStackFull)
        {
            StackArray[StackPointer++] = x;
        }
    }
    public T pop()
    {
        return (!IsStackEmpty) ? StackArray[--StackPointer] : StackArray[0];
    }
    const int MaxStack = 10;
    bool IsStackFull
    {
        get { return StackPointer >= MaxStack; }
    }
    bool IsStackEmpty
    {
        get { return StackPointer <= 0; }
    }
    public MyStack()
    {
        StackArray = new T[MaxStack];
    }
    public void Print()
    {
        for (int i = StackPointer - 1; i >= 0; i--)
        {
            Console.WriteLine($" Value: {StackArray[i]}");
        }
    }
}
class Program {
    static void Main(string[] args) {
        // 构造类
        // int: 类型实参
        MyStack<int> StackInt = new MyStack<int>();
        StackInt.Push(3);
        StackInt.Push(5);
        StackInt.Push(7);
        StackInt.Push(9);
        StackInt.Print();

        // 构造类
        // string: 类型实参
        MyStack<string> StackString = new MyStack<string>();
        StackString.Push("This is fun");
        StackString.Push("Hi there!");
        StackString.Print();
    }
}

泛型方法

+ 概述
  1. 泛型方法可以在泛型和非泛型类以及结构和接口中声明.
  2. 泛型方法有两个参数列表,一个是类型参数列表(封闭在尖括号内),另一个是方法参数列表(封闭在圆括号内).

泛型方法示例

+ 泛型方法示例
using System;

// 非泛型类
class Simple
{
    // 泛型方法
    // <T>: 类型参数列表
    // (T[] arr): 方法参数列表
    static public void ReverseAndPrint<T>(T[] arr) {
        Array.Reverse(arr);
        foreach (T item in arr)
            Console.Write($"{item.ToString()} ");
        Console.WriteLine("");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var intArray = new int[] { 1, 2, 3, 4, 5 };
        var stringArray = new string[] { "first", "second", "third"};
        var doubleArray = new double[] { 1.1, 2.2, 3.3, 4.4, 5.5 };
        Simple.ReverseAndPrint<int>(intArray);
        // 推断类型, 编译器可以从方法参数中推断参数类型.此时可以省略类型参数列表.
        Simple.ReverseAndPrint(intArray);
        Simple.ReverseAndPrint<string>(stringArray);
        Simple.ReverseAndPrint(stringArray);
        Simple.ReverseAndPrint<double>(doubleArray);
        Simple.ReverseAndPrint(doubleArray);
    }
}

泛型接口

概述

泛型接口示例

+ csharp示例

约束(where子句)

+ 概述
  1. 约束使用 where 子句.