当前位置: 首页> 教育> 幼教 > C# 泛型约束

C# 泛型约束

时间:2025/8/19 4:38:11来源:https://blog.csdn.net/m0_53393728/article/details/141435571 浏览次数:0次

目录

概念

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

关键字:C# 泛型约束

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: