(每日心得)对泛型的一些认识

我认为代码重用的思想为泛型的出现起到了至关重要的作用。而且泛型也毫无疑问的做到了这点。

泛型具有类型安全,高性能,代码重用等诸多优点,但是我认为最重要的是他实现了代码的重用。

接下来我列出一些代码:

如上所示我已经利用泛型创建了一个可以前序遍历也可以后续遍历的链表。这个链表可以支持任何类型的数据,借助于泛型我们就不必为整形,浮点型,字符串,类。等等一系列的数据类型创建多个有着相同处理方式,相同代码的类,这样极大的提高了程序员的效率。当然大多时候我们不必去自己编写泛型代码,我们更多的时候可以去利用.NET平台提供的集合完成上述处理。但是这并不能完全取代我们的工作,毕竟平台提供的代码并不总是我们所需要的。泛型与模板一样为我们程序员所追求的目标代码重用提供了至关重要的支持。

以上内容只是我们使用了泛型,但是想必大家和我一样都相当关心,泛型的实现。他是如何在CLR的操作下处理更种各样的实例化操作?实例化代码如何存储?接下来的内容算不上我的原创,以下内容来至于

http://msdn.microsoft.com/zh-cn/library/f4a6ta2h.aspx

我只是充当了一个搬运工的角色,毕竟在我看来对于.NET最专业的还是微软。

将泛型类型或方法编译为 Microsoft 中间语言 (MSIL) 时,它包含将其标识为具有类型参数的元数据。 泛型类型的 MSIL 的使用因所提供的类型参数是值类型还是引用类型而不同。

第一次用值类型作为参数来构造泛型类型时,运行时会创建专用泛型类型,将提供的参数代入到 MSIL 中的适当位置。 对于每个用作参数的唯一值类型,都会创建一次专用泛型类型。例如以Stack<int>实现一个int型的栈结构。

但是,假定在代码中的另一个位置创建了使用不同值类型(比如 long 或用户定义的结构)作为其参数的另一个 Stack<T> 类。 因此,运行时将生成另一个版本的泛型类型,并在 MSIL 中的适当位置替换 long 由于每个专用泛型类本身就包含值类型,因此不再需要转换。

对于引用类型,泛型的工作方式略有不同。 第一次使用任何引用类型构造泛型类型时,运行时会创建专用泛型类型,用对象引用替换 MSIL 中的参数。 然后,每次使用引用类型作为参数来实例化构造类型时,无论引用类型的具体类型是什么,运行时都会重用以前创建的泛型类型的专用版本。 之所以可以这样,是因为所有引用的大小相同。

提到泛型类,我们当然可以创建泛型方法,就像C++中既有函数模板又有类模板。泛型相较于C++的模板函数更加的安全,C#不允许在函数中对泛型类型使用‘+’或‘-’这种只能作用于特定类型的算术操作符,而对于C++则没有这层限制。因为从本质上讲泛型的目的是获得任意类型的支持。不能再实例化某些未重载‘+’或‘-“操作符的类型中出现异常。


这是一个实现了交换值的泛型方法。或许有些人觉得泛型的方法并不是必须存在的,我们实现了泛型类,泛型接口,泛型指代等等。我们在面向对象的指引下不需要什么泛型方法泛型类等已经从很大程度上实现了类型分离的通用代码。但是泛型方法为通用算法的实现却也是功不可没。Math类作为一个静态类,其中包含了很多静态的方法。在MSDN中打开这个类的介绍,我们会发现有相当多的函数重载,或许利用泛型能够减少一些代码量,毕竟在C++中都存在有标准算法的概念。譬如说比较算法,我们没有必要千方百计的为整型,实型,字符串等等实现一些大致相同的算法。

但是正如上面所说为了实现一致性,为了能让所有的类型均能够完美的调用泛型方法,我们不能在泛型方法中对泛型类型使用诸如’+‘,’-‘,’>‘等一系列运算符,因为或许有些类型并未实现了上述操作符由此引发错误。但是如果我们将泛型方法与泛型委托结合起来使用或者就能够让方法更加通用,而不再与某个类型相关。

通过这种形式我们就可以定义自己的通用方法,而不受参数类型的约束。从而极大的提高了代码的重用能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值