首页 > [转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化

[转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化

[泛型的概念]

(1)没有泛型的时候,所有的对象都是以object为基础,如果要使用时必须进行强制类型转换,如果对于值类型,则会导致不断拆箱装箱的过程,对系统消耗很大。

(2)使用泛型时不需要通过object类进行装箱拆箱,使用的时候都会是确定的类型。

(3)泛型的概念一开始是由集合引入,因为集合中的类型都是基于object类。可以在集合中使用泛型类。

(4)泛型不仅仅用于集合,还可以用于委托、接口和方法。

泛型的优点:高性能

ArrayList list1 = new ArrayList();

list1.Add(44); //装箱

int il1 = (int)list1[0];//拆箱

foreach (int i2 in list1)

Console.WriteLine(i2); //执行拆箱



频繁的拆箱、装箱操作在没有泛型的时候反复进行,对系统资源消耗很大。可以使用泛型集合。



List list2 = new List();

list2.Add(44); //不执行装箱

int il2 = list2[0];//不执行拆箱

foreach (int i2 in list2)

Console.WriteLine(i2); //不执行拆箱



泛型在定义的时候就区分了值类型和引用类型。



泛型的优点:类型安全

 ArrayList list = new ArrayList();

  list.Add(44);

  list.Add("mystring");

  list.Add(new MyClass());

  foreach (int i in list)

  Console.WriteLine(i);  



类型安全在于提前避免异常的出现。



List list2 = new List();

list2.Add(44);

 //list2.Add("mystring");

 //list2.Add(new MyClass());

直接编译不通过。





泛型的优点:代码的重用与扩展

List这个泛型类在使用时可以根据需要用不同的类型实例化:



List list=new List();

list.Add(44);



List stringList=new List();

stringList.Add(“mystring”);



List myclassList=new List();

myClassList.Add(new MyClass());



泛型的优点:代码的重用与扩展



定义一个泛型类:

public class aaa 注意:这里的T只是一个标识而已,定义成任何字符都可以。

  {

  public void abc(T a)

  {

  Console.WriteLine(a);

  }

  }



使用它:

  //使用string实例化

  aaa aaa = new aaa();

  aaa.abc("aaabbb");

  //使用int实例化

  aaa bbb = new aaa();

  bbb.abc(new object());

  Console.Read();

命名约定

(1)泛型类型的名称用字母T作为前缀。

(2)使用泛型时,使用,如:

Public class List {}

Public class Linkedlist{}

(3)如果泛型类型有特定的要求(例如必须实现一个派生于基类的接口),或者使用了两个或多个泛型类型,就应给泛型类型使用描述性的名称:

比如:

 public interface ccc

  { void abc(TTT arg1); }

 public class aaa:ccc

  { public void abc(TTT a)

  { Console.WriteLine(a); } }



Public class SortedList{}



泛型集合

泛型集合存在于using System.Collections.Generic下.我们主要介绍如下List ,其它的泛型集合使用请查阅MSDN。



 



 



  强类型和弱类型指的是两个具有直接或者间接继承关系的两个类。如果一个类是另一个类的直接或者间接基类,那么它为弱类型,直接或者间接子类为强类型。后续的介绍中会用到的两个类Foo和Bar先定义在这里。Bar继承自Foo。Foo是弱类型,而Bar则是强类型。



  有了强类型和弱类型的概念,我们就可以这样的定义协变和逆变:如果类型TBar是基于强类型Bar的类型,而类型TFoo是基于弱类型Foo的类型,协变就是将TBar类型的实例赋值给TFoo类型的变量,而逆变则是将TFoo类型的实例赋值给TBar类型的变量。



  委托中的协变与逆变的使用



  协变和逆变主要体现在两个地方:接口和委托,先来看看在委托中如何使用协变和逆变。现在我们定义了如下一个表示无参函数的泛型委托 Function,类型参数为函数返回值的类型。泛型参数之前添加了一个out关键字表示T是一个协变变体。那么在使用过程中,基于强类型的委托 Fucntion实例就可以赋值给基于弱类型的委托Fucntion变量。



 



[强类型弱类型]



一直说C#是强类型语言,通俗地讲,便是指C#中的“变量”在开发时的类型便是明确的:String便是String,Int32就是Int32,毫无争议。强类型的好处有很多,张嘴便可随意举上几例:



能够享受代码提示功能 

能够获得重构工具的支持 

能够在编译期发现更多错误 

 不过C#也不是“绝对”的强类型语言,因为它也有弱类型,那就是Object。我们知道Object是所有类型的最终基类,任何类型的对象都可以使用 Object来引用。可是一旦转化成Object的变量之后,代码提示便消失了;即使我们“明确”对象的确切类型,也必须通过Cast才能使用——更何况它形成了一种被“滥用”或“误用”的机会。例如一段错误代码可能会传入一个不符合约定类型的对象,那么就会造成错误。更严重的是,这样的错误可能只要在 “运行时”才能被发现,编译器对此无能为力。



摘自:http://hi.baidu.com/morespring/blog/item/fe9220358a03690aebc4afa4.html

转载于:https://www.cnblogs.com/bluewhale84/p/4401705.html

更多相关:

  • Python 与 ABC 的一个重要区别在于其类型系统。ABC 采用静态类型,编译器会检查程序中的变量类型是否保持一致,如果不一致,程序就无法运行。并且,ABC与当时大多数静态语言不同,采用的是类型推导(和 Haskell 一样),而不是类型声明(比如 C 语言)。而 Python 采用动态类型,所有类型检查都是在程序运行过程中,而不...

  • python是计算机二级考试的科目之一,并没有级别的划分。其考试目标是测试考生掌握Python语言知识的程度和对Python语言的编程能力、调试能力和综合应用能力,在当下的应用中是十分重要的。 什么是python Python语言是一种解释运行、面向对象、扩展性强的程序设计语言,是大学生学习计算机编程能力、理解计算机解决问题的方法的...

  • 正在学C,书上老说空指针,或者说void指针,对于我这样的生手来说,理解非常容易造成混淆,因为void这个单词的意思也是空,到底空指针的意思是指指向地址为空的类型呢,还是指void类型的指针呢 (1)空指针所对应的是指指向的对象为空的指针。            不经发问,什么叫指向为空呢?要理解这点,必须理解如下几点(有点啰嗦,但...

  • 一、reponseType 1、什么是reponseType XMLHttpRequest.reponseType属性是一个枚举类型的属性,返回响应数据的类型,他允许我们手动的设置 返回数据的类型。如果我们将它设置为一个空字符串,它将默认的使用"text"类型。 当将reponseType设置为一个特定的类型的时候需要确保服务...

  • SNMP中,数据类型并不多。这里我们就讨论这些数据类型,而不关心这些数据类型在实际中是如何编码的。INTEGER一个变量虽然定义为整型,但也有多种形式。有些整型变量没有范围限制,有些整型变量定义为特定的数值(例如,IP的转发标志就只有允许转发时的或者不允许转发时的这两种),有些整型变量定义一个特定的范围(例如,UDP和TCP的端口号...

  • Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a generic array of T,初学泛型时,看到这个错就以为Java中不能创建泛型数组,随着不断的深入,当看到Tinking in J...

  • 1.带有【超类型限定 super】的通配符可以向泛型对象写入,带有【子类型限定 extends】的通配符可以从泛型对象读取,反之则不然。 转载于:https://www.cnblogs.com/baokang/p/7441122.html...

  • nan 是not a number ,inf是无穷大 numpy.nan_to_num(x): 使用0代替数组x中的nan元素,使用有限的数字代替inf元素...

  • 简介 Simple Reference  基础CUDA示例,适用于初学者, 反映了运用CUDA和CUDA runtime APIs的一些基本概念.Utilities Reference  演示如何查询设备能力和衡量GPU/CPU 带宽的实例程序。Graphics Reference  图形化示例展现的是 CUDA, OpenGL,...

  • 在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。...

  • 我在调研ATS 4.2.3挂载SSD的过程中,遇到很多坑,特此详细记录我摸索的主要过程,以便大家以后避免之。 基本思路可以完全照搬参考文献[2][3] 下面的安装假定是以root用户身份进行的,Linux服务器已经安装好系统,磁盘已经做好分区。 首先需要认识我们的Linux服务器的硬件配置和软件情况 硬件配置: DELL...

  • 该博文整理一些在使用stl编程过程中遇到的小经验: 1.在多线程环境下面打印调试,如何使用cout及时刷新到屏幕上? 在C中我们经常这样使用: printf("Hello World "); fflush(stdout); 如果使用stl,我们可以这样使用: cout << "Hello World" << endl <...