博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Efficient C#:为什么要把泛型作为返回值
阅读量:7225 次
发布时间:2019-06-29

本文共 1903 字,大约阅读时间需要 6 分钟。

最近做一题关于泛型返回值的题,结果发现:

1:很多人做错误了;

2:很多人疑问,泛型作为返回值有什么意义;

 

题目如下:

“编写一个函数,要求输入的参数和输出的结果都是泛型。”

 (PS:评论中有人指出,题目本身有问题,更合适的描述是:编写一个函数,要求输入参数和返回值的类型都是泛型类型参数)

典型的错误回答之一:

public List
Function
(U parameter) { return new List
(); }

 

典型的错误回答之二:

void GetList
(ref T t1, out T t2) where T : List
{ t2 = t1; }

 

关于错误回答1,是因为一想到泛型,很多人便想到集合,没错,泛型集合是泛型的一个重要应用场景,但是,这跟泛型本身有什么关系。

 

很多人自然就提出来第二个疑问,那让泛型作为返回值,有什么意义呢,我们先来且看下面的例子:

public T GetActivatedServer
(NetIdentity netIdentity, string name) { string url = netIdentity.GetRemoteBaseUrl() + name; object service = Activator.GetObject(typeof(T), url); return (T)service; }

 

这是remoting中的一个例子,完成的功能是返回一个远程对象的实例。如果没有泛型,我们需要为每个远程对象实例的创建都建立一个方法,而有了泛型之后,可以很方便解决这个问题。(PS:本句欠妥,评论指出“没有泛型的时候我们也可以传个Type进去再在外面强制类型转换”,所以,本句说的“解决这个问题”中的这个问题,不应是指编码更少,更美观,而更应该是但“使用泛型是高效并类型安全的”)

调用的代码为:

IClientContract client = RemoteObjectManager.Manager.GetActivatedServer
(target, "Client");

 

另外,如果大家对LINQ熟悉的话,会发现LINQ中有不少方法也使用了泛型返回值,我们来举一个非常有用的集合方法Find,以下是这个方法的标准实现(.NET内部代码):

public T Find(Predicate
match) { if (match == null) { ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match); } for (int i = 0; i < this._size; i++) { if (match(this._items[i])) { return this._items[i]; } } return default(T); }

其标准的调用代码如:

MarshalByRefObject marshal = ObjRefList.Find(target =>            {                return target.GetType() == obj.GetType();            });

 

最后,附上本题的标准答案:

TResoult GetT
(T1 t) { //some biz code return default(TResoult); }
 
本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2010/11/08/1871782.html,如需转载请自行联系原作者
你可能感兴趣的文章
Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)
查看>>
RT-Thread的线程(任务)处理 rt_thread_create/rt_thread_init区别
查看>>
为什么需要单元测试
查看>>
[原]shell中的三个零碎知识
查看>>
piix4_smbus 0000:00:07.0: SMBus base address uninitialized - upgrade BIOS or use force_addr=0xaddr
查看>>
操作MSSQL服务还有测试是否连接
查看>>
vim命令拾遗[zz]
查看>>
简单PHP留言板之七 —— 附加上css样式表
查看>>
数据库开发篇(一)——转换日期类型
查看>>
php 燕十八 观察者模式代码例子
查看>>
利用Android Lost通过互联网或短信远程控制安卓设备
查看>>
用JvisualVM监视远程tomcat
查看>>
python基础 - 文件读写
查看>>
成大事必备9种能力、9种手段、9种心态
查看>>
php 依赖注入容器
查看>>
matlab设定mex接驳的C/C++编译器
查看>>
Linux系统备份与恢复
查看>>
机场打车有感
查看>>
利用数组创建的顺序表实现各种功能
查看>>
POJ - 1062 昂贵的聘礼(最短路Dijkstra)
查看>>