C#语言进阶——6.C# 的泛型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#语言进阶——6.C# 的泛型相关的知识,希望对你有一定的参考价值。

1.C# 中泛型在 Class 上的实现

   泛型是什么意思呢,就是说我们在编程的时候,需要一个数据类型,刚开的时候不知道数据类型是什么样子。或者多个类型相同的操作,不想重复的写代码,就需要一个泛型来表示一个同样的操作来表示不同的类型。类型安全,性能比较好。

 1  class Program
 2     {
 3 
 4         static void Main(string[] args)
 5         {
 6             //规定一个泛型是整型,这么一个数组
 7             MyGenericArray<int> intArray = new MyGenericArray<int>(5);
 8             //给每一位赋值
 9             for (int c = 0; c < 5; c++)
10             {
11                 intArray.SetItem(c, c * 5);
12             }
13             //输出出来
14             for (int c = 0; c < 5; c++)
15             {
16                 Console.WriteLine(intArray.GetITem(c) + "");
17             }
18             Console.WriteLine();
19 
20             MyGenericArray<char> charArray = new MyGenericArray<char>(5);
21 
22             //给每一位赋值
23             for (int c = 0; c < 5; c++)
24             {
25                 charArray.SetItem(c, (char)(c+97));
26             }
27             //输出出来
28             for (int c = 0; c < 5; c++)
29             {
30                 Console.WriteLine(charArray.GetITem(c) + "");
31             }
32 
33             Console.ReadLine();
34         }
35     }
36     public class MyGenericArray<T>//用<T>来表示我用到了一个泛型
37     {
38         private T[] array;//一个成员变量,数组
39         /// <summary>
40         /// 构造函数
41         /// </summary>
42         /// <param name="size">传进来一个整型,第一个传进来的数组进行一个初始化</param>
43         public MyGenericArray(int size)
44         {
45             array = new T[size + 1];
46         }
47 
48         //创建两个方法,来获取数组的内容
49         public T GetITem(int index)
50         {
51             return array[index];
52         }
53         public void SetItem(int index, T value)
54         {
55             array[index] = value;
56         }
57     }

 

2.C# 泛型类的进一步探讨:泛型类的多个泛型的实现,泛型参数的限制,以及泛型类的继承。

 1 public class MyGenericArray<T,k>//用<T>和 K 来表示我用到了一个泛型,可以传送多个泛型的类型  } 

 1 public class MyGenericArray<T,k> where T: struct//泛型参数的限制:这样的话就只能是c#值类型 还可以 Class interface instance Calss{} 

1     public class SubCalss: MyGenericArray<int> { } //只能继承泛型的int类
2     public class SubCalss2<T> : MyGenericArray<T> where T : struct { } //继承同样是继续是泛型的

3.C# 泛型在 方法Method 上的实现

 1 class Program
 2     {
 3 
 4         static void Main(string[] args)
 5         {
 6 
 7             MyGenericArray<int> intArray = new MyGenericArray<int>(5);
 8             //  方法数据类型的调用,在已有的泛型class上 执行的泛型方法
 9             intArray.GenericMethod<string>("Heelo Generic!");
10             intArray.GenericMethod<int>(100);
11 
12             //在没有泛型的class上 执行的泛型方法
13             int a, b;
14             char c, d;
15             a = 10;
16             b = 20;
17             c = I;
18             d = V;
19             Console.WriteLine("a:{0},b:{1}", a, b);
20             Console.WriteLine("c:{0},d:{1}", c, d);
21             Swap<int>(ref a, ref b);
22             Swap<char>(ref c, ref d);
23             Console.WriteLine("a:{0},b:{1}", a, b);
24             Console.WriteLine("c:{0},d:{1}", c, d);
25             Console.ReadLine();
26         }
27 
28         //泛型在方法上的实现同样可以是一个静态方法,ref 关键字 引用
29         private static void Swap<T>(ref T lhs, ref T rhs)
30         {
31             //交换两个变量的数值
32             T temp;
33             temp = lhs;
34             lhs = rhs;
35             rhs = temp;
36 
37         }
38     }
39 
40     public class MyGenericArray<T> where T : struct//泛型参数的限制:这样的话就只能是c#值类型 还可以 Class  interface instance Calss
41     {
42         private T[] array;//一个成员变量,数组
43         /// <summary>
44         /// 构造函数
45         /// </summary>
46         /// <param name="size">传进来一个整型,第一个传进来的数组进行一个初始化</param>
47         public MyGenericArray(int size)
48         {
49             array = new T[size + 1];
50         }
51 
52         //创建两个方法,来获取数组的内容
53         public T GetITem(int index)
54         {
55             return array[index];
56         }
57         public void SetItem(int index, T value)
58         {
59             array[index] = value;
60         }
61 
62         //如果我们要用到一个泛型方法跟这边的T不一定同一个数据类型的做法 
63         public void GenericMethod<X>(X x)
64         {
65             Console.WriteLine(x.ToString());
66         }
67     }

 

4.C# 泛型在委托 Delegate 上的实现

 1  class Program
 2     {
 3         //实现个委托,里面是泛型的,所有用到数据类型的都可以用到一个T,返回的也是T
 4         delegate T NumberChanger<T>(T n);
 5         //
 6         static int num = 10;
 7 
 8         //实现了一个加数值的一个功能
 9         public static int AddNum(int p)//还是一个静态的 因为静态的可以直接被Main 函数调用
10         {
11             num += p;
12             return num;
13         }
14 
15         //实现了一个乘数值的一个功能
16         public static int NultNum(int p)//还是一个静态的 因为静态的可以直接被Main 函数调用
17         {
18             num *= p;
19             return num;
20 
21         }
22         static void Main(string[] args)
23         {
24             NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
25             NumberChanger<int> nc2 = new NumberChanger<int>(NultNum);
26             nc1(25);
27             Console.WriteLine(num);
28             nc2(5);
29             Console.WriteLine(num);
30             Console.ReadLine();
31         }
32 
33 
34     }

 

以上是关于C#语言进阶——6.C# 的泛型的主要内容,如果未能解决你的问题,请参考以下文章

C#中的泛型

转载:C#中的泛型

C#中的泛型详解

C#进阶C# 泛型

c#中的泛型

C# 语言:泛型、打开/关闭、绑定/未绑定、构造