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);
        }

本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2010/11/08/1871782.html,如需转载请自行联系原作者
相关文章
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
存储 算法 安全
C#三十二 泛型的理解和使用
C#三十二 泛型的理解和使用
74 0
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
209 11
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
214 4
|
存储 安全 Java
34.C#:listT泛型集合
34.C#:listT泛型集合
144 1
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
689 2
|
存储 C#
C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。
301 0
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。
|
存储 Java 编译器
【从Java转C#】第五章:泛型
【从Java转C#】第五章:泛型
|
机器学习/深度学习 存储 缓存
一文带你搞懂C#泛型
泛型是.net 2.0中提供的新特性,是框架的一种升级,用于处理用一个事物来代替多种不同需求的情况。下面我们就一块来看一下具体的讲解吧。