C#的泛型约束-

`class b
{

}
class c
{
public c(string s)
{

}
public void hello<T>(T t) where T: new()
{ 
}

}
class a where T:class
{
public T x;
}
public class FanxingClient : MonoBehaviour {

void Start () {
    a<c> abc = new a<c>();
    abc.x.hello<b>(new b());

    a<c> abc2 = new a<c>();
    abc2.x = new c("");
}`

记一下笔记今天学习了下 C#中的泛型约束 对类的约束和对方法的约束
类的约束:

class a where T:class
{
public T x;
}

限制泛型类的T类型只能为引用类型,还可以用struct, 限制为值类型也可以直接用int,float等关键字.
方法的约束:

public void hello<T>(T t) where T: Struct
    { 
    }

和类的约束类似,只是还可以进行参数的约束

public void hello<T>(T t) where T: new()
    { 
    }

限制只能用无参的构造方法
注:自己的一些理解,不对的地方,欢迎指出来~~~

<think>好的,用户现在想了解C#中的约束。之前他们已经问过多播委托,可能是在逐步学习C#的高级特性。需要先回顾一下用户的历史问题,确保回答的结构和之前一致,保持清晰。 首先,用户的需求是介绍约束。需要先解释的基本概念,然后过渡到约束的必要性。因为允许使用任何类型,但有时候需要限制类型参数,比如确保有某个方法或继承自特定类。 接下来,要明确约束类型。常见的包括where T : struct(值类型),where T : class(引用类型),where T : new()(有无参构造),接口约束,基类约束等。需要逐一解释每种约束的用法和场景。 用户可能想知道为什么需要这些约束,所以需要举例说明。比如,在方法中,如果调用了某个方法,但没有约束,编译器会报错,加上接口约束后就可以调用该方法。这能帮助用户理解约束的实际作用。 另外,用户可能对多个约束的写法不太清楚,需要说明如何同时应用多个约束,并注意顺序,比如struct必须在最前面,new()在最后。 还要提到协变和逆变中的约束,但可能用户现阶段不需要太深入,可以简要提及。此外,未绑定的类型参数作为约束的情况虽然少见,但有必要说明。 代码示例很重要,用户之前的回复中有详细的代码片段,所以这次也要提供具体的例子。例如,用接口约束展示方法调用,用new()约束展示实例化,用基类约束展示继承关系。 需要注意事项部分,比如值类型约束不支持非可空,引用类型约束排除值类型,多个约束的顺序问题。这些是用户容易出错的地方,需要强调。 最后总结使用场景,帮助用户理解何时使用哪种约束,比如工厂模式用new(),集合操作用接口约束等。结构要和之前的回答一致,使用清晰的标题和分点,确保用户容易跟随思路。 检查是否有遗漏的约束类型,比如枚举约束,虽然可能不常用,但应该提及。同时确保术语准确,比如协变逆变可能属于高级主题,根据用户水平决定是否详细展开。 最后确保语言口语化,避免过于技术化,但保持专业性。示例代码要简洁,注释明确,输出结果清楚,方便用户测试和理解。</think>### **C# 约束(Generic Constraints)的工作原理与使用场景** 在 C# 中,**约束(Generic Constraints)** 用于限制类型参数(`T`)的范围,确保类型参数满足特定条件(如必须实现接口、必须是引用类型或值类型等)。约束通过 `where` 关键字定义,是增强代码安全性和灵活性的核心机制。 --- ### **1. 约束的作用** - **类型安全**:限制类型参数的范围,避免运行时错误。 - **启用功能**:允许在代码中调用类型参数的方法或访问属性(例如,要求 `T` 必须实现某个接口)。 - **消除歧义**:明确类型参数的语义(如要求 `T` 必须是值类型或引用类型)。 --- ### **2. 约束类型** #### **(1) 基类约束** 要求 `T` 必须继承自指定基类。 ```csharp public class MyClass<T> where T : MyBaseClass { public void UseBaseMethod(T obj) { obj.BaseMethod(); // 可调用基类方法 } } ``` #### **(2) 接口约束** 要求 `T` 必须实现指定接口。 ```csharp public void Log<T>(T item) where T : ILoggable { item.WriteLog(); // 可调用接口方法 } ``` #### **(3) 值类型约束(`struct`)** 要求 `T` 必须是值类型(如 `int`、`struct` 等)。 ```csharp public T CreateValue<T>() where T : struct { return default(T); // 只能处理值类型 } ``` #### **(4) 引用类型约束(`class`)** 要求 `T` 必须是引用类型(如类、接口、委托等)。 ```csharp public void Process<T>(T obj) where T : class { if (obj == null) throw new ArgumentNullException(); } ``` #### **(5) 无参构造函数约束(`new()`)** 要求 `T` 必须具有无参数的公共构造函数。 ```csharp public T CreateInstance<T>() where T : new() { return new T(); // 可安全实例化 } ``` #### **(6) 组合约束** 可同时应用多个约束,注意顺序:`class/struct` → 基类 → 接口 → `new()`。 ```csharp public class Factory<T> where T : MyBaseClass, IDisposable, new() { public T Build() { T instance = new T(); instance.Initialize(); return instance; } } ``` #### **(7) 枚举约束(`System.Enum`)** 要求 `T` 必须是枚举类型C# 7.3+)。 ```csharp public string GetEnumName<T>(T value) where T : Enum { return Enum.GetName(typeof(T), value); } ``` #### **(8) 委托约束(`System.Delegate`)** 要求 `T` 必须是委托类型C# 7.3+)。 ```csharp public void Execute<T>(T action) where T : Delegate { action.DynamicInvoke(); } ``` --- ### **3. 代码示例** #### **场景:实现一个集合工具类** ```csharp using System; using System.Collections.Generic; public interface IComparable<T> { int CompareTo(T other); } public class Utilities { // 约束 T 必须实现 IComparable<T> 接口 public static T Max<T>(List<T> list) where T : IComparable<T> { if (list.Count == 0) throw new ArgumentException("List is empty"); T max = list[0]; foreach (T item in list) { if (item.CompareTo(max) > 0) max = item; } return max; } } // 自定义类实现 IComparable<T> public class Product : IComparable<Product> { public string Name { get; set; } public decimal Price { get; set; } public int CompareTo(Product other) { return Price.CompareTo(other.Price); } } // 使用示例 var products = new List<Product> { new Product { Name = "Laptop", Price = 1200 }, new Product { Name = "Phone", Price = 800 } }; Product mostExpensive = Utilities.Max(products); Console.WriteLine($"Most expensive: {mostExpensive.Name}"); // 输出:Laptop ``` --- ### **4. 注意事项** 1. **值类型约束(`struct`)**:无法约束为可空值类型(如 `int?`)。 2. **引用类型约束(`class`)**:排除所有值类型(如 `int`、`struct`)。 3. **构造函数约束(`new()`)**:若 `T` 是抽象类或没有无参构造方法,编译时会报错。 4. **组合约束顺序**:必须按 `class/struct` → 基类 → 接口 → `new()` 的顺序声明。 --- ### **5. 典应用场景** - **集合操作**:要求元素实现 `IComparable` 以支持排序。 - **工厂模式**:要求类型必须有公共无参构造函数。 - **数据处理**:约束类型为值类型以提高性能(如数值计算)。 - **插件架构**:限制类型必须实现特定接口以扩展功能。 --- ### **总结** - **核心语法**:`where T : 约束条件`。 - **核心价值**:在编译期强制类型安全,避免运行时错误。 - **灵活组合**:通过多约束支持复杂业务逻辑(如“必须是引用类型且实现某个接口”)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值