C#

面向对象(十二)-泛型

2017-12-10  本文已影响41人  元宇宙协会

1. 简介:

2.0 版 C# 语言和公共语言运行时 (CLR) 中增加了泛型。 泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。

2.语法

class ClassName<Type>
    {
         public void Add(Type input)
        {
        }
    }

    class Program
    {
        public void test0()
        {
            ClassName<int> testClass = new ClassName<int>();
            testClass.Add(5);
            print<int>(5, 6);
            print(5, 6); // <>可以省略
        }

        public void print<T1>(T1 x, T1 y)
        {
            Console.WriteLine(x.ToString(),y.ToString());
        }

    }

3.约束

约束 说明 雷潮
T : struct 类型参数必须是值类型。
T : class 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
T:new() 类型参数必须具有无参数的public构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。
T:<基类名> 类型参数必须是指定的基类或派生自指定的基类。
T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。
T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。
class TestClass<TestType> where TestType : struct
    {
            
    }

    static void Main(string[] args)
     {
            TestClass<int> t1 = new TestClass<int>();

            //TestClass<string> t2 = new TestClass<string>(); 错误,只能传递值类型
    }

可以对同一类型参数应用多个约束,并且约束自身可以是泛型类型,如下所示:

        class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
        {
            // ...
        }
         class Base { }
         class Test<T, U>
              where U : struct
              where T : Base, new()
              { }
        class List<T>
        {
            void Add<U>(List<U> items) where U : T {/*...*/}
        }

在上面的示例中,T在 Add方法的上下文中是一个类型约束,而在 List 类的上下文中是一个未绑定的类型参数。

类型参数还可在泛型类定义中用作约束。 请注意,必须在尖括号中声明此类型参数与任何其他类型的参数:

SampleClass<T, U, V> where T : V { }
        void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
        {
            T temp;
            if (lhs.CompareTo(rhs) > 0)
            {
                temp = lhs;
                lhs = rhs;
                rhs = temp;
            }
        }

泛型方法可以使用许多类型参数进行重载。 例如,下列方法可以全部位于同一个类中:

        void DoWork() { }
        void DoWork<T>() { }
        void DoWork<T, U>() { }

4.泛型接口

语法:

 interface ITest1<K> 
    {

    }

一个接口可定义多个类型参数,如下所示:

    interface ITest1<K, V> 
    {

    }

适用于类的继承规则同样适用于接口:

    interface ITest1<S> 
    {

    }

    interface ITest2<K> : ITest1<K>
    {
         
    }

泛型接口的约束:

    interface ITest1<S> where S : class
    {

    }

泛型接口的约束继承

    interface ITest1<S> where S : class
    {
        
    }

    interface ITest2<K> : ITest1<K> where K : class
    {
         
    }

作者:silence_k
链接:http://www.jianshu.com/p/010411e9aec1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇下一篇

猜你喜欢

热点阅读