C# 泛型约束

1、泛型约束

让泛型的类型有一定的限制

关键字:where

泛型约束一共有6种:

值类型where 泛型字母:struct
引用类型where 泛型字母:class
存在无参公共构造函数where 泛型字母:new()
某个类本身或者派生类where 泛型字母:类名
某个接口的派生类型(派生类型可以为类或接口)where 泛型字母:接口名
另一个泛型类型本身或者派生类型where 泛型字母:另一个泛型字母

2、各泛型约束讲解

列举部分,未列举的类似

(1)值类型约束

class Test<T> where T:struct{

    public T value;

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

    }

}

(2)引用类型约束

class Test<T> where T:class{

    public T value;

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

    }

}

(3)公共无参构造约束

class Test<T> where T:new(){

    public T value;

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

    }

}

public Test2{
    // 如果该类的公共无参构造被重载覆盖,或者无参构造被声明为private,会报错
    // 该类也不能为抽象类
}
Test<Test2> t = new Test<Test2>();

Test<int> t = new Test<int>();  // 结构体的无参构造不会被覆盖,所有的结构体都有无参构造函数

(4)另一个泛型约束

class Test<T,U> where T:U{

    public T value;

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

    }

}

其中T与U相同或者T是U的派生类型,K类似

3、约束的组合使用

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

}

但是要注意

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

}

会报错,因此new()一般写在最后

4、多个泛型有约束

后面空格接where,同样的格式

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

}

5、练习

用泛型实现一个单例模式基类

// where T : new() 是因为 instance = new T() 要确保 T 类型要有无参构造函数,但这样会导致类的构造函数是 public 的
class SingleBase<T> where T : new(){
    private static T instance = new T();

    public static T Instance {
        get {
            return instance;
        }
    }
}

class Test : SingleBase<Test> {
    public int value = 10;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值