C#泛型基础

         C#语言推出泛型已经有好多年了。泛型的推出可以说是一项创举,可是实际上我们经常是怎样使用泛型的呢。?。

  之前也常用一些泛型的基本用法,语法也看过一段时间。但是毕竟还是有很多”高级“一些的用法没怎么用过。最近做一个基于微软MCS架构的项目时,很多都给封装好了,包括常用的TextBox也被微软那帮人给重写了。由于大量的重写,所以难免会有大量的泛型等等大量的运用。看到被封装好的源码,也难免不去梳理一下相关知识。这一节主要包括一下几个部分:

  1、泛型约束

       2、new关键字.

       3、default关键字的用法

 

      以上是c#泛型最基本的几个知识点.下面将说说这些概念的理解以、关键字。

     1、泛型约束.

     何谓泛型约束呢。?泛型约束是我们在定义泛型类时,在实际泛型类的使用过程中,对泛型类类型的一些约束。

     泛型约束是通过泛型类定义来体现的。请看下面代码中泛型约束的定义:

 

public  class BaseClass
    {
        public  BaseClass()
        {
            Console.WriteLine("Abstractor  constructor method");
        }

        public void Method()
        {
            Console.WriteLine(" method in Base Class");
        }
    }
   public class TestSubClass : BaseClass
   {
       //public override void Method()
       //{
       //    Console.WriteLine("testSubClass method");
       //}

   }

   public class Cat
   {
       public void CatEat()
       {
           Console.WriteLine("CatEat method");
       }
   }

   public class SubClass<T> where T:BaseClass
    {
        public T instance;

        public void subMethod()
        {
            Console.WriteLine("subClass");
    
        }
    }

  其中 SubClass<T>就是一个自定义类,T为泛型类型,where T:BaseClass就是定义的泛型类的约束。意思就是说在使用SubClass<T>时候,我们必须用BaseClass或者BaseClass的子类来对SubClass<T>进行实例化。

使用如下:

 

SubClass<BaseClass> cast = new SubClass<BaseClass>();
            cast.subMethod();
            SubClass<TestSubClass> cast2 = new SubClass<TestSubClass>();
            cast2.subMethod();
            Console.WriteLine("aa");
            Console.ReadLine();

  输出如下:

    2、new关键字。

         new关键字的作用是值对泛型类型的默认构造函数。类型定义如下:

   public abstract class BaseClass
    {
        public  BaseClass()
        {
            Console.WriteLine("Abstractor  constructor method");
        }

        public virtual void Method()
        {
            Console.WriteLine("Method in Abastact class");
        }
    }
  public class TestSubClass : BaseClass
   {
       public TestSubClass()
       {
           
       }
   }
public class SubClass<T> where T:BaseClass,new ()
    {
        public T instance;

        public void subMethod()
        {
            Console.WriteLine("subClass");
            if (instance == null)
            {
                instance = new T();
                instance.Method();
                Console.WriteLine(instance.GetType().ToString());
            }
        }
    }
     对比泛型约束,对BaseClass的改动仅限为将其改为抽象类、并在自定义类型 SubClass<T>中在where中使用了new ()

.new () 的意思是说泛型类型T必须要有一个无参数构造函数。

输出如下:

 此时,需要注意的是在用TestSubClass替换泛型类型T实例化 SubClass<T>时候,可以在TestSubClass中不定义任何构造函数,但是若我们要定义带参数的构造函数时,一定同时要有不带参数构造函数。因为我们不定义构造函数时,.Net FrameWork会默认有一个无参数构造函数,但是如果我们定义了一个带参数的,则它只有这个构造函数了,这是C#语法开遍就介绍过了。

  另外:在使用new进行约束时,不能带有带参数的构造函数。

     3、default关键字的使用。

  首先给出MSDN给出的介绍:

在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:

  • T 是引用类型还是值类型。

  • 如果 T 为值类型,则它是数值还是结构。

  给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。以下来自 GenericList<T> 类的示例显示了如何使用 default 关键字。

  首先看看它的用法:

 public class TestGeneric<T>
    {
        public T GetValue()
        {
            T instance = default(T);
            if (instance == null)
            {
                Console.WriteLine(" instance is null");
            }
            else
            {
                Console.WriteLine("value of instance is {0}",instance);
            }
            return instance;

        }
    }
}

TestGeneric<string> instance = new TestGeneric<string>();
            instance.GetValue();
            Console.ReadLine();
输出如下:

 如果将泛型类型string换位int,则输出如下:

  那么如果我们用struct类型替换泛型类型会是什么情况呢。?

  可以定义一个struct试试:

      代码如下:

  public struct Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

TestGeneric<Point> instance = new TestGeneric<Point>();
            instance.GetValue();
            Console.ReadLine();
输出如下:

 struct是一种值类型的,所以它不会像string等引用类型使用default的时候会为null。

 好了,就到这里,希望对初学泛型的朋友有一些帮助!

posted @ 2011-01-22 00:23  tyb1222  阅读(1056)  评论(0编辑  收藏  举报