C#where关键字约束
where关键词一个最重要的用法就是在泛型的声明、定义中做出约束。
约束又分为接口约束、基类约束、构造函数约束、函数方法的约束。
1.接口约束,泛型参数必须实现相应的接口才可以
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace where约束程序 { public class Student : IStudent { private string name; private int id; //实现IStudnet接口 public string GetName { get { return name; } } public int GetID { get { return id; } } } //接口约束,T必须是实现了IStudent接口的类 public class MyClass1<T> where T: IStudent { public MyClass1() { Console.WriteLine("接口约束构造成功!"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace where约束程序 { public interface IStudent { string GetName{ get; } int GetID { get; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace where约束程序 { class Program { static void Main(string[] args) { MyClass1<Student> myclass1 = new MyClass1<Student>(); Console.ReadKey(); } } }
输出结果
接口约束构造成功!
2.基类约束,类型参数必须是指定的基类或派生自指定的基类,多用于继承体系之下
3.构造函数约束,对构造函数有一定的约束
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace where约束程序 { public class Teacher:People { public Teacher() { } public Teacher(string name,int age,string sex):base(name,age,sex) { } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace where约束程序 { public class People { public int Age { get; set; } public string Name { get; set; } public string Sex { get; set; } public People() { } public People(string name,int age,string sex) { Name = name; Age = age; Sex = sex; } } //基类约束,T必须是People或者People的子类 public class MyClass2<T> where T:People { public MyClass2() { Console.WriteLine("基类约束构造成功"); } } //构造函数约束,T必须是引用类型,且必须具有无参构造函数 public class MyClass3<T> where T : class,new() { public MyClass3() { Console.WriteLine("构造函数约束构造成功"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace where约束程序 { class Program { static void Main(string[] args) { MyClass2<Teacher> myclass2 = new MyClass2<Teacher>(); MyClass3<Teacher> myclass3 = new MyClass3<Teacher>(); //MyClass3<Student> myclass4 = new MyClass3<Student>();//由于Studnet中没有显示的声明构造函数,所以会自动生成一个默认的无参构造函数 Console.ReadKey(); } } }
总结:
- where T : struct 这表明T必须是一个值类型,像是int,decimal这样的
- where T : class 这表明T必须是一个引用类型,像是自定义的类、接口、委托等
- where T : new() 这表明T必须有无参构造函数,且如果有多个where约束,new()放在最后面
- where T : [base class name] 这表明T必须是base class类或者其派生类
- where T : [interface name] 这表明T必须实现了相应的接口
4556
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?