泛型

泛型(generic)的作用就是,通过一个相同的代码操作不同类型的数据;编写代码时可以减少大量的重要代码,提高代码编写的工作效率;运行时绑定实际的数据类型,并不影响代码的执行效率。C#中的泛型支持泛型方法、泛型类、泛型接口等泛型应用。

泛型方法

我们先来看一个交换对象数据的泛型方法,如下面的代码。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 10, y = 99;
            Swap(ref x, ref y);
            Console.WriteLine("x={0},y={1}", x, y);
            //
            float a = 10f, b = 99f;
            Swap(ref a, ref b);
            Console.WriteLine("a={0:f}, b={1:f}", a, b);
            //
            CAuto car1 = new CAuto("c10");
            CAuto car2 = new CAuto("c99");
            Swap(ref car1, ref car2);
            Console.WriteLine("car1={0},car2={1}", car1.Model, car2.Model);
        }
        static void Swap<T> (ref T x, ref T y)
        {
            T tmp = x;
            x = y;
            y = tmp;
        }
    }
}

代码中的Swap()方法定义为泛型方法,在方法名的后面使用一对尖括号定义了一个类型标识T;然后,在参数列表和方法体中使用了此类型。Swap()方法的功能就是交换两个参数的数据,所以使用了引用参数(ref)。

Main()方法中,我们分别使用Swap()方法交换了int、float和CAuto对象的值,代码执行结果如下图。

泛型类

泛型类的定义同样需要指定泛型标识,如下面的代码。

C#
public class CDataItem<K,V>{
    //
    public CDataItem(K k,V v)
    {
        Key = k;
        Value = v;
    }
    //
    public K Key { get; set; }
    public V Value { get; set; }
}

CDataItem泛型类中使用了两个泛型标识,下面,我们在Main()方法中测试此类的使用。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            CDataItem<string, string> item =
                 new CDataItem<string, string>("Name", "Tom");
            Console.WriteLine("Key={0}, Value={1}",
                 item.Key, item.Value);
        }
    }
}

代码执行结果如下图。

泛型接口

接口中使用泛型,则需要使用泛型类来实现,如下面的代码。

C#
public interface I6<T>{
    T Value { get; set; }
    void SetValue(T v);
    T GetValue();}public class C6<T> : I6<T>{
    // 构造方法
    public C6(T v)
    {
        Value = v;
    }
    //
    public T Value { get; set; }
    //
    public void SetValue(T v)
    {
        Value = v;
    }
    //
    public T GetValue()
    {
        return Value;
    }
}

I6定义为泛型接口,其中定义了一个属性和两个方法;C6类实现了I6接口。下面的代码,我们在Main()方法中测试。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            I6<string> c6 = new C6<string>("abcd");
            Console.WriteLine(c6.Value);
            c6.SetValue("efg");
            Console.WriteLine(c6.GetValue());
        }
    }
}

代码执行结果如下图。

泛型约束

泛型约束是指在定义泛型时,可以指事实上类型的范围,如指定类型必须实现了某个接口。下面的代码,我们定义的C7类中就应用了泛型约束。

C#
public class C7<T> where T : I3
{
    public T Compenent { get; set; }
    public void Work()
    {
        Compenent.Method1();
        Compenent.Method2();
        (Compenent as I1).Method9();
    }
}

代码中,我们定义T只能是实现了I3接口的类型,如C3类、C3A类。下面,我们在Main()方法中测试C7类的应用。

C#
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            C7<C3A> c7 = new C7<C3A>();
            c7.Compenent = new C3A();
            c7.Work();
        }
    }
}

代码执行结果如下图。

本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc002011