【C#】C# in deep 泛型

2021-03-29 08:30

阅读:386

标签:数据类型   泛型类   实例化   函数   哪些   作用   类型转换   大量   except   

泛型

为什么要有泛型, 在没有泛型之前, 什么东西充当了泛型的作用?

在泛型出现之前, 代码中会有很多需要强制转换的地方. 比如 int a = (int) object, 对于这样类似的代码, 编译器在编译期间无法确定是否是正确的代码, 只有在真正运行代码期间才会校验出来是否正确. 这种强制转换实际上是让编译器去相信你的代码. 并且你需要撰写大量的文档或者注释去解释你的代码.还有的时候你在写代码的时候, 会遇到两个代码块极其的相似, 只是参数类型上有所区别. 一个是对int类型进行操作, 一个是对string类型进行操作. 但是你不得不写两份, 或者你写出了一个公共的object去处理. 但是在使用object的功能时候, 又同样会遇到很多装箱拆箱, 也可能会遇到各种执行时ClassCastException的异常.

 1 public class Stack
 2     {
 3 
 4         private object[] m_item;
 5 
 6         public object Pop() {...}
 7 
 8         public void Push(object item) {...}
 9 
10         public Stack(int i)
11         {
12 
13             this.m_item = new[i];
14 
15         }
16     }

泛型的出现就是为了解决上述情况. 让编译器在编译期间就能够发现这种错误, 从而在执行期间减少检查还有很多的装箱和拆箱的处理, 来达到一个提升程序性能的一个目的.

 1 public class Stack 2 {
 3     private T[] m_item;
 4 
 5     public T Pop(){...}
 6 
 7     public void Push(T item){...}
 8 
 9     public Stack(int i){
10 
11          this.m_item = new T[i];
12 
13     }
14 }
Stackint> a = new Stackint>(100);

   a.Push(10);

   a.Push("8888");//这行编译不通过,因为类a只接收int类型的数据

   int x = a.Pop();

Stack b = new Stack(100);

    b.Push(10);//这行编译不通过,因为类b只接收String类型的数据

   String y = b.Pop();

所以泛型的优势在于:

1.它是类型安全的。实例化了int类型的栈,就不能处理String类型的数据,其他的数据类型也一样。

2.无需装箱和拆箱。这个类在实例化时,按照所传入的数据类型生成本地代码,本地代码数据类型已确定,所以无需装箱和拆箱。

3.无需类型转换。

 

泛型分为 泛型类, 和泛型方法.

泛型中的约束有哪些:

用这些约束可以限制T是哪些.

1. 值约束  T:struct

2. 引用约束 T:Class

3. 构造函数约束 T: new()

4. 转换类型约束

5. 组合约束

【C#】C# in deep 泛型

标签:数据类型   泛型类   实例化   函数   哪些   作用   类型转换   大量   except   

原文地址:https://www.cnblogs.com/it-dennis/p/9151862.html


评论


亲,登录后才可以留言!