首页 > 代码库 > 可否定义拥有返回值的方法的委托链
可否定义拥有返回值的方法的委托链
分析问题
委托的方法可以是无返回的方法,也可以是有返回值的方法。回顾一下委托的使用:
Meth a=new Meth(Method1);a+=new Meth(Method2);a+=new Meth(Method3);int returnVal=a();
当使用类似的代码时,委托链表中各个方法的返回值起了冲突,最后一行代码只从委托中取得一个返回值,而事实上该委托链表包含三个方法,而每个方法都具有一个返回值。读者将会看到,当这样使用委托时,只有委托链表上最后被调用的方法返回值才被返回。以下代码展示了这一特性。
using System;namespace Test{ public delegate string GetStringDelegate(); class DelegateReturn { static void Main() { GetStringDelegate _myDelegate1 = new GetStringDelegate(GetTimeString); _myDelegate1 += GetTypeName; _myDelegate1 += GetSelfDefinedString; Console.WriteLine(_myDelegate1()); GetStringDelegate _myDelegate2 = new GetStringDelegate(GetSelfDefinedString); _myDelegate2 += GetTypeName; _myDelegate2 += GetTimeString; Console.WriteLine(_myDelegate2()); GetStringDelegate _myDelegate3 = new GetStringDelegate(GetSelfDefinedString); _myDelegate3 += GetTimeString; _myDelegate3 += GetTypeName; Console.WriteLine(_myDelegate3()); Console.Read(); } static string GetTimeString() { return DateTime.Now.ToString(); } static string GetTypeName() { return typeof(DelegateReturn).ToString(); } static string GetSelfDefinedString() { return "我是字符串"; } }}
下面是这段程序的执行结果:
正如读者所看到的,虽然委托链中所有的方法都被正确执行,但委托的使用者只得到了最后一个方法所返回的值。这个结果非常糟糕,丢失大部分的方法返回值可能会造成很大的麻烦。在一些程序中,往往不会采用异常机制,而是返回一个非0的正数来告诉使用者方法执行不成功。如果该方法被添加到一个委托链的中间,那这个方法的返回值很可能就被丢失了,在这种情况下,程序员需要手动地执行委托链中的每个方法。下面笔者重写了以上代码的Main方法。
static void Main() { GetStringDelegate _myDelegate1 = new GetStringDelegate(GetTimeString); _myDelegate1 += GetTypeName; _myDelegate1 += GetSelfDefinedString; foreach (Delegate d in _myDelegate1.GetInvocationList()) { Console.WriteLine(d.DynamicInvoke()); } Console.Read(); }
在这种情况下,委托链中每个方法的返回值都不会丢失,下面是程序的执行结果:
答案
委托可以是带有返回值的方法,但多于一个带返回值的方法被添加到委托链中时,程序员需要手动地调用委托链上的每个方法,否则委托使用者将只能得到委托链上最后一个被执行方法的返回值。
可否定义拥有返回值的方法的委托链
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。