Efficient C#:为什么要把泛型作为返回值

http://www.cnblogs.com/luminji/archive/2010/11/08/1871782.html

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

1:很多人做错误了;

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

 

题目如下:

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

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

典型的错误回答之一:

        public List<T> Function<T, U>(U parameter)
        {
            return new List<T>(); 
        }

 

典型的错误回答之二:

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

 

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

 

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

        public T GetActivatedServer<T>(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<IClientContract>(target, "Client");

 

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

    public T Find(Predicate<T> 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<TResoult, T1>(T1 t)
        {
            //some biz code 
            return default(TResoult);
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值