【c#心得记录】委托细节四

编程开发   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2021-12-29

#【c#心得记录】委托细节三#
除此之外还提供了Predicate(泛型指定参数类型类型 返回bool类型 Comparison(泛型指定两个参数类型共同类型 返回int类型) Converter(泛型指定参数类型 返回类型类型)等委托
//其他委托
Predicate predicate = (p) =>
{
Console.WriteLine("委托强类型:Predicate" + " 参数:" + p);
return p > 0;
};
Comparison comparison = (x, y) =>
{
Console.WriteLine("委托强类型:Comparison" + " 参数x:" + x + " 参数y:" + y);
return x - y;
};
Converter converter = (p) =>
{
Console.WriteLine("委托强类型:Converter" + " 参数:" + p);
return p.ToString();
};

委托可变性
C#中可变性分为协变 逆变 更加具体一点的说应该是返回类型的协变性 参数类型的逆变性

返回类型派生程度较大的方法可以用来实例化返回类型派生程度较小的委托 比如声明一个返回类型为object的委托 可以使用返回类型为string的方法来实例化该委托

PS:可以这么理解 当我调用OutputObjDelegate 委托的时候 该委托应该返回一个object类型的参数 那么MyPrint.StaticReturnStr方法返回了一个string类型的参数 string类型可以隐式转换为object 对该委托来说符合它的返回类型
//返回类型协变
OutputObjDelegate delOutObjOut = MyPrint.StaticReturnStr;


参数类型派生程度较小的方法可以用来实例化参数类型派生程度较大的委托 比如声明一个参数类型为string的委托 可以使用参数类型为object的方法来实例化该委托

PS:可以这么理解 当我调用InputStrDelegate委托的时候 应该传入一个string类型的参数 这时候该委托调用了MyPrint.StaticPrintObject方法 传入一个string类型的参数作为该方法的object类型参数 同样string类型可以隐式转换为object 并不会违反委托参数类型的限制
//参数类型逆变
InputStrDelegate delInStrIn = MyPrint.StaticPrintObject;


委托可变性只支持引用类型

PS:C#中引用类型派生自System.Object类 值类型派生自System.ValueType类 System.ValueType类派生自System.Object类 值类型的基类为object 同样是派生关系 但是可变性并不支持值类型 有没有想过这是为什么呢?

委托的本质
委托的本质究竟是什么 来反编译一下看看InputObjDelegate委托的MSIL代码
.class public auto ansi sealed Library.InputObjDelegate
extends [mscorlib]System.MulticastDelegate

很明显得出结论 对于MSIL来说委托其实就是一个类(.class) 并且不可被继承(sealed) 派生自System.MulticastDelegate类(extends [mscorlib]System.MulticastDelegate)

PS:委托类型被声明在类内部则被编译为一个嵌套类型(nested)的类 可以简单的理解为内部类
文档中说明该类提供了委托多播的实现 内部维护了一个调用列表用来处理委托多播 派生自System.Delegate类 且我们不能从该类显示派生

成为第一个回答人

评论

登录后才可发表内容
  • 主题

    20

  • 帖子

    80

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.2253s Mem:2048Kb