委托

.NET Freamwork通过委托来提供回调函数机制。我们可以利用回调方法来获得各种各样的通知
构造委托对象需要方法签名完全一样(方法参数和返回类型)。
委托的协变性和逆变性。例如:
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表达式允许直接内连那些代码,不必为它分配名称
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值