泛型中new()约束的用法

本文详细解析了.NET中泛型的类型参数约束,包括结构类型、类类型、无参构造函数、基类继承及接口实现等约束条件。并通过具体代码示例展示了new()约束的应用,强调了公共无参构造函数的重要性。同时,介绍了多个泛型类型参数的定义方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、.NET中支持的类型参数约束有以下几种


where T : struct              T必须是一个结构类型
where T : class               T必须是一个类(class)类型,不能是结构(structure)类型
where T : new()               T必须要有一个无参构造函数
where T : NameOfBaseClass     T必须继承名为NameOfBaseClass的类
where T : NameOfInterface     T必须实现名为NameOfInterface的接口

 

 

二、泛型中new()约束基本形式

class A<T> where T : new() 

 

 

三、泛型中new()约束实例

 

 

 
  1. public class A<T> where :class,new()

  2.  
  3. {

  4.  
  5. public void Func()

  6.  
  7. {

  8.  
  9. T t=new T();

  10.  
  11. }

  12.  
  13. }

 

 

 

四、泛型中new()约束的注意事项

 

1、泛型定义中有new()约束关键字时,表示必须有一个公共的无参的构造函数。简单点说就是你传递一个类代替T的时候,这个类必须有一个构造函数,且必须是公共的无参的。

2、当有多个约束时候,new()关键字必须放到坐后面。

3、在使用new()约束时,可以通过调用该无参构造函数来创建对象。 

 

 

 

五、多个泛型类型参数

对于多个类型参数,每个类型参数都使用一个 where 子句

 

 
  1. class Dictionary<TKey, TVal>

  2. where TKey : IComparable, IEnumerable,new()

  3. where TVal : IMyInterface,new()

  4. {

  5. public void Add(TKey key, TVal val)

  6. {

  7. }

  8. }

 

 

 

 

文章转载自: 泛型中new()约束   http://www.studyofnet.com/news/988.html

<think>我们正在讨论C#参数约束。根据引用,我们可以总结如下: 1. 引用[1]展示了在成员函数中使用参数作为约束的例子,其中`U`必须继承自`T`。 2. 引用[2]说明类参数可以在类定义中用作约束,并且必须在尖括号中声明所有类参数。 3. 引用[3]提到C#7.3以后允许使用枚举类作为约束。 4. 引用[4]强调了约束的重要性,以避免运行时错误。 用户的问题:了解C#中参数约束的条件和用法。 回答结构: 1. 解释什么是约束及其作用。 2. 列出常见的约束并举例说明。 3. 说明多个约束用法。 4. 提及一些特殊的约束(如枚举、委托等)以及版本支持情况。 5. 使用示例代码展示用法。 注意:所有代码示例中的参数和约束需要正确使用LaTeX格式(行内用$...$,独立成段用$$...$$)。但由于这里主要是代码块,我们使用代码块标记。 同时,按照要求生成相关问题。</think>### C# 参数约束详解 #### 一、约束的作用与语法 约束通过`where`关键字限制可传入的类参数,确保类安全性和功能可用性。基本语法: ```csharp class MyClass<T> where T : constraint_type { ... } ``` #### 二、主要约束用法 1. **基类约束** 要求类参数必须继承指定基类: ```csharp class Repository<T> where T : EntityBase { public void Save(T entity) { ... } } ``` 2. **接口约束** 要求实现特定接口,支持多接口约束: ```csharp void Log<T>(T data) where T : ILogger, ISerializable { ... } ``` 3. **值类约束** (`struct`) 限制为值类(枚举、结构体等): ```csharp T CreateDefault<T>() where T : struct => default; ``` 4. **引用类约束** (`class`) 限制为引用类: ```csharp class Cache<T> where T : class { ... } ``` 5. **无参构造函数约束** (`new()`) 要求类必须有公共无参构造函数: ```csharp T CreateInstance<T>() where T : new() => new T(); ``` 6. **枚举约束** (C# 7.3+) 限制为枚举类: ```csharp string GetName<T>(T value) where T : Enum => Enum.GetName(typeof(T), value); ``` 7. **类参数约束** 约束参数之间的关系: ```csharp class Converter<T, U> where U : T { ... } // U必须继承T ``` #### 三、多约束组合 可叠加多个约束,顺序为:主约束 → 接口约束 → 构造函数约束: ```csharp T Process<T>(T obj) where T : BaseClass, IDisposable, new() { using (obj) { return new T(); } } ``` #### 四、特殊约束 - **非空约束** (C# 8.0+, `notnull`): `where T : notnull` 排除可空类 - **委托/元组约束** (C# 7.3+): `where T : Delegate` 或 `where T : ValueTuple` #### 五、使用场景 1. **类安全** 避免向方法传入不支持操作的类[^4]。 2. **访问特定成员** 如约束为`IComparable`后可调用`CompareTo()`方法。 3. **设计模式应用** 工厂模式中确保可实例化(`new()`约束)[^2]。 > 示例:带约束集合 ```csharp public class SmartList<T> where T : IEntity, new() { public void AddItem() => items.Add(new T()); private List<T> items = new(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值