C#泛型委托,约束

一、泛型委托

泛型的委托有很多,但掌握常见的泛型委托应用即可

委托可以定义它自己的类型参数。

引用泛型委托的代码可以指定类型参数以创建封闭式构造类型。

cs 复制代码
public delegate void Del<T>(T t);//Del<T> 是一个泛型委托
public static void Notify(int t) { }//通过 Del<int> 将 T 指定为 int,就是创建了一个封闭的构造类型。
Del<int> m1 = new Del<int>(Notify);//实例化 Del<int>

常见的委托有Action,Func,Predicate,Converter等等。

Action特点:没有参数,没有返回值。只要没有参数,没有返回值的方法都可以满足委托。

cs 复制代码
Action action = () => {
    Console.WriteLine("委托");
};
// 必须调用,才会执行
action();

Action<in T>泛型委托,in是关键字,转到定义查看

cs 复制代码
// 泛型委托
Action<int> action = (int arg) =>
{
    Console.WriteLine(arg);
};
action(10);

Func<out TResult>泛型委托,out是关键字,转到定义查看

cs 复制代码
Func<string> func1 = () =>
{
    return "hello";
};
Console.WriteLine(func1());

Predicate<in T>泛型委托,in是关键字,转到定义查看

cs 复制代码
Predicate<string> predicate = (string arg) =>
{
    return arg == "hello";
};
Console.WriteLine(predicate("hello"));

Converter<in TInput, out TOutput>这个有两个关键字

cs 复制代码
Converter<int, string> converter = (int i) =>
{
    return i.ToString("C2");
};
Console.WriteLine(converter(200));//¥200.00

其实用法都是一样的 ,结构也是一样的,只是传的关键字和参数不同罢了

委托名<in T或out T> 变量名=()=>{ }

二、泛型约束

泛型的目的:相同的业务逻辑,支持了不同类型。但一味的滥用,则对代码安全性不利。

所谓的泛型约束,实际上就是约束的类型T 。使T必须遵循一定的规则。比如T必须继承自某个类,或者T必须实现某个接口等等。

约束泛型为引用类型

cs 复制代码
static void Main(string[] args)
{
    //演示约束泛型为引用类型
    //int是结构,值类型都是结构,而泛型类MyClass有约束 where:class,因此如下报错。
    //MyClass<int> myClass = new MyClass<int>();

    //string引用类型,用类来实现
    MyClass<string> myClass1 = new MyClass<string>();
}
// 约束泛型类T必须是引用类型
public class MyClass<T> where T : class
{

}

约束泛型为结构体

cs 复制代码
static void Main(string[] args)
{
   // 演示约束泛型为结构体
 MyClass1<double> myClass = new MyClass1<double>();
 MyClass1<DateTime> myClass1 = new MyClass1<DateTime>();
 MyClass1<Sex> myClass2 = new MyClass1<Sex>();
} 

// 约束泛型类中T必须是结构体
public class MyClass1<T> where T: struct
{
}

约束无参构造函数

cs 复制代码
static void Main(string[] args)
{
    // 演示约束有无参构造函数
    MyClass2<int> myClass5 = new MyClass2<int>();
    //MyClass2<string> myClass51 = new MyClass2<string>();//string本身没有公共的无参构造函数。
    MyClass2<Person> myClass52 = new MyClass2<Person>();
} 

 // 类默认带有一个无参构造函数。
 // 有参构造函数可以重载,有多个
 // where T: new()约束泛型类型T必须有公共无参数构造函数
 public class MyClass2<T> where T : new()
 {
 }

基类约束

cs 复制代码
static void Main(string[] args)
{
    MyClass3<Animal> myClass6 = new MyClass3<Animal>();
    MyClass3<Person> myClass7 = new MyClass3<Person>();
} 
// 基类约束:Animal这个类型,或者由Animal类型派生的子类型都可以替代泛型类中的T。
// 密封类不能当成泛型约束。
public class MyClass3<T> where T : Animal
{
}

约束类必须实现某个接口

cs 复制代码
static void Main(string[] args)
{
    // int没有实现IMyInterface1,如下报错
    //MyClass4<int> myClass8 = new MyClass4<int>();

    // 由于Person实现了IMyInterface1,满足了泛型约束成某个接口的条件。
    MyClass4<Person> myClass9 = new MyClass4<Person>();
} 
// 约束类必须实现某个接口
// T必须实现MyInterface1
public class MyClass4<T> where T : IMyInterface1
{
}
相关推荐
凯子坚持 c5 分钟前
仓颉编程语言深入教程:基础概念和数据类型
开发语言·华为
小爬虫程序猿7 分钟前
利用Java爬虫速卖通按关键字搜索AliExpress商品
java·开发语言·爬虫
程序猿-瑞瑞9 分钟前
24 go语言(golang) - gorm框架安装及使用案例详解
开发语言·后端·golang·gorm
qq_4335545410 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法
易码智能18 分钟前
【EtherCATBasics】- KRTS C++示例精讲(2)
开发语言·c++·kithara·windows 实时套件·krts
一只自律的鸡19 分钟前
C语言项目 天天酷跑(上篇)
c语言·开发语言
程序猿000001号21 分钟前
使用Python的Seaborn库进行数据可视化
开发语言·python·信息可视化
鸿喵小仙女23 分钟前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
一个不正经的林Sir26 分钟前
C#WPF基础介绍/第一个WPF程序
开发语言·c#·wpf
API快乐传递者31 分钟前
Python爬虫获取淘宝详情接口详细解析
开发语言·爬虫·python