zoukankan      html  css  js  c++  java
  • Efficient C#:为什么要把泛型作为返回值

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

    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);
            }
    Creative Commons License本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
  • 相关阅读:
    LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
    UVA 10564 Paths through the Hourglass(背包)
    Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)
    UVALive 3530 Martian Mining(贪心,dp)
    UVALive 4727 Jump(约瑟夫环,递推)
    UVALive 4731 Cellular Network(贪心,dp)
    UVA Mega Man's Mission(状压dp)
    Aizu 2456 Usoperanto (贪心)
    UVA 11404 Plalidromic Subsquence (回文子序列,LCS)
    Aizu 2304 Reverse Roads(无向流)
  • 原文地址:https://www.cnblogs.com/luminji/p/1871782.html
Copyright © 2011-2022 走看看