C# 泛型约束

目录

概念

1.值类型约束

2.引用类型约束

3.公共无参构造约束

4.类约束

5.接口约束

6.另一个泛型约束

约束的组合使用

多个泛型有约束


概念

让泛型的类型有一定的限制
    关键字:where
    泛型约束一共有6种
    1.值类型                              where 泛型字母:struct
    2.引用类型                            where 泛型字母:class
    3.存在无参公共构造函数                 where 泛型字母:new()
    4.某个类本身或者其派生类               where 泛型字母:类名
    5.某个接口的派生类型                  where 泛型字母:接口名
    6.另一个泛型类型本身或者派生类型       where 泛型字母:另一个泛型字母

     where 泛型字母:(约束的类型)

1.值类型约束

class Test1<T> where T:struct
{
    public T value;

    public void TestFun<K>(K v) where K:struct
    {

    }
}

main

{

Test1<int> t1 = new Test1<int>();
 t1.TestFun<float>(1.3f);

}

 

2.引用类型约束

class Test2<T> where T:class
{
    public T value;

    public void TestFun<K>(K k) where K:class
    {

    }
}

main

{

  Test2<Random> t2 = new Test2<Random>();
  t2.value = new Random();
  t2.TestFun<object>(new object());

}

3.公共无参构造约束

class Test3<T> where T:new()
{
    public T value;

    public void TestFun<K>(K k) where K : new()
    {

    }
}

class Test1

    public Test1(){     }

}

class Test2
{
    public Test2(int a){    }
}

main

{

     Test3<Test1> = new Test();

  //  Test3<Test2>=new Test(); Test2的构造函数有参数不符合公共无参的标准

}

4.类约束

class Test4<T> where T : Test1
{
    public T value;

    public void TestFun<K>(K k) where K : Test1
    {

    }
}

class Test3:Test1
{

}

main

{

    可以是Test1和他的派生类

Test4<Test3> t4 = new Test4<Test3>();

}

5.接口约束

 interface IFly
 {

 }

 interface IMove:IFly
 {

 }

 class Test4:IFly
 {

 }

 class Test5<T> where T : IFly
 {
     public T value;

     public void TestFun<K>(K k) where K : IFly
     {

     }
 }

main

{

Test5<IMove> t5 = new Test5<IMove>();

Test5<IFly> t6 = new Test5<IFly>();
t6.value = new Test4(); //Test4继承了IFly接口

}

6.另一个泛型约束

  class Test6<T,U> where T : U  //T的类型是Test4 U的类型是IFly 这里的T可以是IFly本身或者是其
  {                                               //派生类型,Test4继承了IFly接口
      public T value;

      public void TestFun<K,V>(K k) where K : V
      {

      }
  }

main

{

 Test6<Test4, IFly> t6 = new Test6<Test4, IFly>();

}

约束的组合使用

 class Test7<T> where T: class,new()
 {

 }

多个泛型有约束

 class Test8<T,K> where T:class,new() where K:struct
 {

 }


泛型单例

class SingleForm<K> where K:new()
{
    private static  SingleForm<K> singleForm;
  protected SingleForm() { }
    public static  SingleForm<K> Single
    {
        get { return singleForm=new SingleForm<K>(); }
    }
 
}

 class Manager : SingleForm<Manager>
{
    
}

泛型ArrayList

class ArrayList<T>
{
   private   T [] array;
    public  int Capacity
    { 
        get { return array.Length; } 
    }
   private   int length;
    public int Length
    {
        get { return length; }
    }
    public ArrayList() 
    {
       
        array = new T [16];
        length = 0;
    }
    public T this[int index]
    {
        get 
        {
            if (index >= length)
            {
                Console.WriteLine("索引不合法");
                return default(T);
            }
            
            return array[index]; 
        }
        set 
        {
            if (index >= length)
            {
                Console.WriteLine("索引不合法");
                return;  //表示不执行下面的代码
            }
            array[index] = value; 
        }
    }

    public void Add(T a)
    {
        if (length == Capacity)
        {
            T [] temp = new T [Capacity *2];
            for (int i = 0; i < Capacity ; i++)
            {
                temp [i] = array [i];
            }
            array = temp;
        }

        array[length] = a;
        length++; 
    }
    public void RemoveAt(int index)
    {
        if (index >= length)
        {
            Console.WriteLine("索引不合法");
            return;
        
        }
        for (int i = index ; i < length; i++)
        {
            array[index ]=array[index+1];

        }
        length--;
        array[length] = default(T);
    }
}

class Program
{
  

    public   static void Main()
    {
        ArrayList<int> arrayList = new ArrayList<int>();
        Console.WriteLine(arrayList.Capacity);
        Console.WriteLine(arrayList.Length);
        arrayList.Add(1);
        arrayList.Add(2);
        arrayList.Add(3);
        arrayList[0] = 100;
        arrayList .RemoveAt(2);
        Console.WriteLine(arrayList.Capacity);
        Console.WriteLine(arrayList.Length);

        Console.WriteLine (arrayList[0]);

    }
    
}

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值