C# where 修饰符

官方文档:where(泛型类型约束)- C# 参考 - C# | Microsoft Learn

泛型定义中的 where 子句指定对用作泛型类型、方法、委托或本地函数中类型参数的参数类型的约束,约束必须位于任何声明的基类或实现的接口之后。

常用的约束类型有值类型,引用类型,new() 和 自定义类型

// 值类型约束
class MyClass<T> where T : struct {}    // T必须为值类型

// 引用类型约束
class MyClass<T> where T : class {}     // T必须为引用类型

// new 约束
class MyClass<T> where T : new()        // 类型参数T必须具有可访问的无参数构造函数
                                        
// 自定义类型约束
class MyClass<T> where T : Base // 类型参数T为Base的基类及其派生类,Base为用户自定义类型

// compare约束 参数 T 实现比较接口
class MyClass<T> where T : IComparable
{
    public int CompareTo(object obj)
    {
        // 小于零 此实例在排序顺序中位于 obj 之前。 零 顺序相同
        return 0;
    }
}


// 当与其他约束一起使用时,new() 约束必须最后指定,例:单例泛型(单线程)
public class Singleton<T> where T : class, new()
{
    private static T _instance = null;

    public static T GetInstance()
    {
        if (_instance == null)
        {
            _instance = new T();
        }
        return _instance;
    }
}

不常用的类型约束

// unmanaged约束
public class MyClass<T, Y> where T : unmanaged
                           where Y : class
{}

/*
   该约束不支持与 struct、class、 new() 约束共用,它所支持的类型包括以下几点:
     1 类型为 sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、    
       decimal、bool、IntPtr 或 UIntPtr
     2 可以是枚举类型
     3 可以是指针类型
     4 可以是符合非托管约束的自定义结构(结构的内部字段成员符合以上要求)

*/

where 用于查询表达式做约束条件

int[] nums = { 4, 6, 7, 8, 99, 11, 0 };
var selectNums = from num in nums 
                 where num < 50 && num % 2 == 0 
                 select num;

foreach(int val in selectNums)
{
    // ..
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值