委托
2016-06-21 17:29
134 查看
.NET Freamwork通过委托来提供回调函数机制。我们可以利用回调方法来获得各种各样的通知
构造委托对象需要方法签名完全一样(方法参数和返回类型)。
委托的协变性和逆变性。例如:
协变性:SomeMethod的返回类型(String)派生自委托的Object
逆变性:SomeMethod的参数(Stream)是委托的参数类(FileStream1)的基类
注意只有引用类型才支持上面说的协变性和逆变性,值类型和Void都不支持,因为他们的存储结构是变化的,而引用类型的存储结构始终是一个指针。
{
Program p = new Program();
Count(1,3,new FeedBack(p.FeedbackToFile));
Console.WriteLine();
}’
上述例子是委托可以包装对实例方法的调用,简而言之就是创建了一个非静态的方法,用类的实例来调用而已
不需要构造委托对象
不需要指定回调的那个委托方法(lambda表达式)
Lambda表达式其实是在类中自动定义了一个匿名方法,然后=>右边的代码就会放入到这个匿名方法中,其实综合起来看,本例子是对上述简化委托对象的进一步的简化。
如果方法里面的代码有多行且有返回值,需要用大括号括起来
如果只需在代码中引用方法执行的代码一次,那么Lambda表达式允许直接内连那些代码,不必为它分配名称
构造委托对象需要方法签名完全一样(方法参数和返回类型)。
委托的协变性和逆变性。例如:
dlegate Object MyCallback(FileStream s); String SomeMethod(Stream s)
协变性:SomeMethod的返回类型(String)派生自委托的Object
逆变性:SomeMethod的参数(Stream)是委托的参数类(FileStream1)的基类
注意只有引用类型才支持上面说的协变性和逆变性,值类型和Void都不支持,因为他们的存储结构是变化的,而引用类型的存储结构始终是一个指针。
用委托回调实例方法
‘private static void InstanceDelegateDemo(){
Program p = new Program();
Count(1,3,new FeedBack(p.FeedbackToFile));
Console.WriteLine();
}’
private void FeedbackToFile(Int32 value) { using (streamWrite sw = new StreamWriter("Status",true)) { sw.WriteLine("Item=" + value); } }
上述例子是委托可以包装对实例方法的调用,简而言之就是创建了一个非静态的方法,用类的实例来调用而已
委托揭秘
委托是类,凡是能定义类的地方都能定义类的地方都能定义委托。类就好比数据的集合,而委托就更像是方法的集合一样!委托语法糖
事实上,越是高级的语言,提供的简化语法就越多,以方便写程序,这就是所谓的语法糖。不需要构造委托对象
internal sealed class AClass{ public static void CallbackWithoutNewingADelegateObject() { ThreadPool.QueueUserWorkItem(SomeAsyncTask,5); } private static void SomeAsynTask(Object o) { Console.WriteLine(o); } }
不需要指定回调的那个委托方法(lambda表达式)
internal sealed class AClass { public static void CallbackWithoutNewingADelegateObject() { ThreadPool.QueueUserWorkItem(Obj=>Console.Writeline(obj), 5); } }
Lambda表达式其实是在类中自动定义了一个匿名方法,然后=>右边的代码就会放入到这个匿名方法中,其实综合起来看,本例子是对上述简化委托对象的进一步的简化。
如果方法里面的代码有多行且有返回值,需要用大括号括起来
如果只需在代码中引用方法执行的代码一次,那么Lambda表达式允许直接内连那些代码,不必为它分配名称
相关文章推荐
- getResourceAsStream returns null
- ArrayList
- 运用Fluxion高效破解WiFi密码
- 其他软件的使用问题记录
- 第6章 软负载中心与集中配置管理
- Java多线程编程中ThreadLocal类的用法及深入
- eclipse集成weblogic开发环境的搭建
- [Scala--基础]--windows 10安装、配置环境变量步骤
- 在Android Studio中设置或修改默认的Android SDK路径。
- 第十三周项目二动物这样叫一
- 正则应用篇
- TCP 函数
- 如何在页面中生成动态的百度地图
- 转 思杰南京笔试
- Linux 学习之路重启
- Swing中多线程操作UI
- Android 获取ListView中的item控件(mListView.getChildAt(int pos))
- 【mybatis】——快速入门
- 方法:查询MongoDB数据库中最新一条数据(JAVA)
- LINQ to Entities 不识别方法“System.Nullable`1[System.Int32] DiffDays(System.Nullable`1[System.DateTime], System.Nullable`1[System.DateTime])”,因此该方法无法转换为存储表达式。