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(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
  • 相关阅读:
    handler之责任链模式
    简单的PL/SQl链接远程ORACLE数据库方法
    An internal error occurred during: "Add Deployment". Container with path org.eclipse.jdt.launching.
    myeclipse非正常关闭处理办法
    jQuery Plugin Poshy Tip 使用 统一提示信息
    myeclipse部署maven时,src/main/resources里面配置文件加载不到webapp下classes路径下的问题
    CSS实现背景透明,文字不透明,兼容所有浏览器
    @SuppressWarnings注解
    @GeneratorValue与@GenericGenerator注解使用心得
    jap的教程
  • 原文地址:https://www.cnblogs.com/luminji/p/1871782.html
Copyright © 2011-2022 走看看