深入浅出.NET泛型编程(1)

深入浅出.NET泛型编程(1)
使用泛型集合

  .NET 2.0的System.Collections.Generics 命名空间包含了泛型集合定义。各种不同的集合/容器类都被"参数化"了。为使用它们,只需简单地指定参数化的类型即可。请看例2:

  例2.类型安全的泛型列表
None.gifList<int> aList = new List<int>();
None.gifaList.Add(
3);
None.gifaList.Add(
4);
None.gif
// aList.Add(5.0);
None.gif
int total = 0;
None.gif
foreach(int val in aList)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif total 
= total + val;
ExpandedBlockEnd.gif}

None.gifConsole.WriteLine(
"Total is {0}", total); 
None.gif
在例2中,我编写了一个泛型的列表的例子,在尖括号内指定参数类型为int。该代码的执行将产生结果"Total is 7"。现在,如果我去掉语句doubleList.Add(5.0)的注释,我将得到一个编译错误。编译器指出它不能发送值5.0到方法Add(),因为该方法仅接受int型。不同于例1,这里的代码实现了类型安全。

  5. CLR对于泛型的支持

  泛型不仅是一个语言级上的特征。.NET CLR能识别出泛型。在这种意义上说,泛型的使用是.NET中最为优秀的特征之一。对每个用于泛型化的类型的参数,类也同样没有脱离开微软中间语言(MSIL)。换句话说,你的配件集仅包含你的参数化的数据结构或类的一个定义,而不管使用多少种不同的类型来表达该参数化的类型。例如,如果你定义一个泛型类型MyList<T>,仅仅该类型的一个定义出现在MSIL中。当程序执行时,不同的类被动态地创建,每个类对应该参数化类型的一种类型。如果你使用MyList<int>和MyList<double>,有两种类即被创建。当你的程序执行时,让我们进一步在例3中分析这一点。

  例3.创建一个泛型类
None.gif//MyList.cs
ExpandedBlockStart.gifContractedBlock.gif
Using directives#region Using directives
InBlock.gif
using System;
InBlock.gif
using System.Collections.Generic;
InBlock.gif
using System.Text;
ExpandedBlockEnd.gif
#endregion

None.gif
namespace CLRSupportExample
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif 
public class MyList<T>
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
private static int objCount = 0;
InBlock.gif  
public MyList()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{objCount++; }
InBlock.gif  
public int Count
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   
get
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{return objCount; }
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

None.gif
//Program.cs
ExpandedBlockStart.gifContractedBlock.gif
Using directives#region Using directives
InBlock.gif
using System;
InBlock.gif
using System.Collections.Generic;
InBlock.gif
using System.Text;
ExpandedBlockEnd.gif
#endregion

None.gif
namespace CLRSupportExample
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif 
class SampleClass dot.gif{}
InBlock.gif 
class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   MyList<
int> myIntList = new MyList<int>();
InBlock.gif   MyList<
int> myIntList2 = new MyList<int>();
InBlock.gif   MyList<
double> myDoubleList = new MyList<double>();
InBlock.gif   MyList<SampleClass> mySampleList 
= new MyList<SampleClass>();
InBlock.gif   Console.WriteLine(myIntList.Count);
InBlock.gif   Console.WriteLine(myIntList2.Count);
InBlock.gif   Console.WriteLine(myDoubleList.Count);
InBlock.gif   Console.WriteLine(mySampleList.Count);
InBlock.gif   Console.WriteLine(
new MyList<sampleclass>().Count);
InBlock.gif   Console.ReadLine();
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

该例中,我创建了一个称为MyList泛型类。为把它参数化,我简单地插入了一个尖括号。在<>内的T代表了实际的当使用该类时要指定的类型。在MyList类中,定义了一个静态字段objCount。我在构造器中增加它的值。因此我能发现使用我的类的用户共创建了多少个那种类型的对象。属性Count返回与被调用的实例同类型的实例的数目。

  在Main()方法,我创建了MyList<int>的两个实例,一个MyList<double>的实例,还有两个MyList<SampleClass>的实例--其中SampleClass是我已定义了的类。问题是:Count(上面的程序的输出)的值该是多少?在你继阅读之前,试一试回答这个问题。

  解决了上面的问题?你得到下列的答案了吗?
1None.gif2
2None.gif2
3None.gif1
4None.gif1
5None.gif2   
6ExpandedBlockStart.gifContractedBlock.gif/**//*注意:这里是2。因为这个是运行时动态创建的,在编译时,static的变量值为1,如同第一,第二行,他们都是2,因为在编译时就已经创建两个int类型的实例,所以static的值是2*/

前面两个2对应MyList<int>,第一个1对应MyList<double>,第二个1对应MyList<SampleClass>--在此,仅创建一个这种类型的实例。最后一个2对应MyList<SampleClass>,因为代码中又创建了这种类型的另外一个实例。上面的例子说明MyList<int>是一个与MyList<double>不同的类,而MyList<double>又是一个与MyList<SampleClass>不同的类。因此,在这个例中,我们有四个类:MyList: MyList<T>,MyList<int>,MyList<double>和MyList<X>。注意,虽然有4个MyList类,但仅有一个被存储在MSIL。怎么能证明这一点?请看图1显示出的使用工具ildasm.exe生成的MSIL代码。
ng.jpg
6. 泛型方法

  除了有泛型类,你也可以有泛型方法。泛型方法可以是任何类的一部分。让我们看一下例4:

  例4.一个泛型方法

None.gifpublic class Program
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif 
public static void Copy<T>(List<T> source, List<T> destination)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
foreach (T obj in source)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif   destination.Add(obj);
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif }

InBlock.gif 
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  List<
int> lst1 = new List<int>();
InBlock.gif  lst1.Add(
2);
InBlock.gif  lst1.Add(
4);
InBlock.gif  List<
int> lst2 = new List<int>();
InBlock.gif  Copy(lst1, lst2);
InBlock.gif  Console.WriteLine(lst2.Count);
ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

Copy()方法就是一个泛型方法,它与参数化的类型T一起工作。当在Main()中激活Copy()时,编译器根据提供给Copy()方法的参数确定出要使用的具体类型。
posted on 2005-08-19 23:24 海盗 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/Grisson/archive/2005/08/19/218844.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

74. Search a 2D Matrix

文章目录1 题目理解2 二分1 题目理解 输入:一个mxn的int数组matrix,这个数组每一行按照从小到大排序,并且下一行的第一个值大于上一行的最后一个值。一个int值target 返回:target在matrix中是否存在。存在返回true。 2 二分 我…

spring mvc学习(13)windows上安装maven

本地安装与配置: 1.jdk 在cmd中运行 Java -version 2.下载maven包 https://maven.apache.org/download.cgi下载最新版的Maven程序:(选择bin zip包) 将文件解压在D:\Program Files\apache-maven-3.5.4 3.下载eclipse并安装 …

spring mvc学习(14) the superclass “javax.servlet.http.HttpServlet” was not found

问题描述:   我们在用MyEclipse进行Java web开发时,可能会出现这样的错误:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path。我们该怎么解决这个问题呢? 我遇到的错误显示如下…

4. Median of Two Sorted Arrays

文章目录1题目理解2 二分查找解题2.1中位数的定义2.2 数组切分2.3分析条件1题目理解 输入:2个已经排序号的int数组nums1,nums2 输出:这两个数组合并后的中位数 要求:m是nums1的长度,n是nums2的长度。时间复杂度应该是O(log(mn))。…

第九十三期:带你聊聊 Java 并发编程之线程基础

百丈高楼平地起,要想学好多线程,首先还是的了解一下线程的基础,这边文章将带着大家来了解一下线程的基础知识。 作者:小九 01、简介 百丈高楼平地起,要想学好多线程,首先还是的了解一下线程的基础&#x…

我们还有理想吗?

兴致勃勃从海边享受了几天,本来打算回来后在这里写上几篇.其中还准备了一篇名为"一千个不加班的理由".可笑的是今天就从梦中醒来.因为有几个项目要加快投标准备了.我唯一能做的是耸耸肩膀,公司的事情当然要做,现实就是现实!前几天和老同学突然谈起一个话题,别的行业的…

17. Letter Combinations of a Phone Number

1 题目理解 给定一个字符串string,字符范围是[2,9]之间的数字。数字表示电话上的一个按钮。返回字符串的可能所有组合方式。每个数字对应的字母如下图所示。 Example 1: Input: digits “23” Output: [“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”…

第九十四期:GitHub 发布 2019 年年度报告

GitHub 发布了 2019 年年度报告《The State of the Octoverse》,下边来看看一些主要数据。 作者:佚名 GitHub 发布了 2019 年年度报告《The State of the Octoverse》,下边来看看一些主要数据。 全球用户超过 4 千万 目前 GitHub 上有超过…

COM 组件设计与应用(十一)

COM 组件设计与应用(十一)IDispatch 及双接口的调用作者:杨老师 下载源代码一、前言 前段时间,由于工作比较忙,没有能及时地写作。其间收到了很多网友的来信询问和鼓励,在此一并表示感谢。咳......我也需…

39. Combination Sum

文章目录1题目理解2 回溯分析3 40. Combination Sum II3.1 延续39解题思路3.2 新思路3.3 递归计数的方式4 216. Combination Sum III1题目理解 Given an array of distinct integers candidates and a target integer target, return a list of all unique combinations of ca…

第九十五期:Python帮你识破双11的套路

一年一度的“双十一”又要来了,很多人已经开始摩拳擦掌,毕竟几天之后手还在不在就不好说了。 作者:清风小筑 各种社交软件也是跟着遭殃,整天就是“来帮我一起盖楼”,各种字体绕过屏蔽,什么奇葩的脑洞也出来…

客户端独立弹出详细的实现过程

拷贝粘贴以下代码段&#xff0c;保存为html文件&#xff0c;试试看效果如何吧。。。前几天贴子没写东西就搁在上面搁了几天&#xff0c;真不好意思。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML><HEAD></HEAD>&…

Unity3D性能优化之Draw Call Batching

在屏幕上渲染物体&#xff0c;引擎需要发出一个绘制调用来访问图形API&#xff08;iOS系统中为OpenGL ES&#xff09;。每个绘制调用需要进行大量的工作来访问图形API&#xff0c;从而导致了CPU方面显著的性能开销。Unity在运行时可以将一些物体进行合并&#xff0c;从而用一个…

第九十六期:JavaScript 中的 4 个相等比较算法的介绍

JavaScript 运算中&#xff0c;一共包含 4 个相等比较算法&#xff1a;抽象相等比较&#xff1b;严格相等比较&#xff1b;SameValueZero&#xff1b;SameValue。 作者&#xff1a;zhangbao90s JavaScript 运算中&#xff0c;一共包含 4 个相等比较算法&#xff1a; 抽象相等…

第九十七期:新版Kite:实时补全代码,Python之父都发声力挺!

不久前&#xff0c;一个免费的专门针对 Python 的代码补全工具 Kite&#xff0c;有了新的动态。 作者&#xff1a;杨鲤萍 本文转自雷锋网&#xff0c;如需转载请至雷锋网官网申请授权。 不久前&#xff0c;一个免费的专门针对 Python 的代码补全工具 Kite&#xff0c;有了新…

svn 版本升级的问题

原创文章&#xff0c;转载请注明 svn本地版本由1.6升级到1.7后&#xff0c;再使用时遇到一些问题&#xff0c;这里记录一下以备忘。 升级后&#xff0c;使用任何命令 不能用了&#xff0c;提示的意思大致是本地的workcopy版本太低了&#xff08;之前用1.6版本&#xff0c;check…

[JavaME]手机申请移动分配的动态IP(3)?

获取IP后是否可以和它通讯呢&#xff1f;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Hi&#xff0c;继续上回的讨论《[JavaME]手机是否能够申请到动态IP[2]?》。 上回说到申请动态IP是可以了&#xff0c;并且准备好了一个线…

第九十八期:TIOBE11月榜单:C、Swift、Go、D与Rust起起伏伏

TIOBE 指数并不代表语言的好坏&#xff0c;开发者可以使用该榜单检查自身的编程技能是否需要更新&#xff0c;或者在开始构建新软件时对某一语言做出选择。 作者&#xff1a;oschina TIOBE 公布了 11 月份编程语言排行榜。 本月前 20 名中有一些有趣的现象&#xff0c;先看看…

Vue 之 slot(插槽)

前言&#xff1a; vue中关于插槽的文档说明很短&#xff0c;语言又写的很凝练&#xff0c;再加上其和methods&#xff0c;data&#xff0c;computed等常用选项在使用频率、使用先后上的差别&#xff0c;这就有可能造成初次接触插槽的开发者容易产生“算了吧&#xff0c;回头再学…

第一百期:Java架构师:高并发下的流量控制

这个时候如果不做任何保护措施&#xff0c;服务器就会承受很大的处理压力&#xff0c;请求量很高&#xff0c;服务器负载也很高&#xff0c;并且当请求超过服务器承载极限的时候&#xff0c;系统就会崩溃&#xff0c;导致所有人都不能访问。 作者&#xff1a;IT技术分享 这个…