可否定义拥有返回值的方法的委托链

分析问题

  委托的方法可以是无返回的方法,也可以是有返回值的方法。回顾一下委托的使用:

  

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();
        }

  在这种情况下,委托链中每个方法的返回值都不会丢失,下面是程序的执行结果:

答案

  委托可以是带有返回值的方法,但多于一个带返回值的方法被添加到委托链中时,程序员需要手动地调用委托链上的每个方法,否则委托使用者将只能得到委托链上最后一个被执行方法的返回值。

时间: 2024-08-11 03:16:27

可否定义拥有返回值的方法的委托链的相关文章

定义一个带参带返回值的方法,实现输出随机数数组

public class mains { public static void main(String[] args) { // 创建对象,对象名为hello mains hello = new mains(); // 调用方法并将返回值保存在变量中 int[] nums = hello.getArray(8); // 将数组转换为字符串并输出 System.out.println(Arrays.toString(nums)); } /* * 功能:创建指定长度的int型数组,并生成100以内随

060、Java中定义有返回值有参数的方法

01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public static void main(String[] args) { int result = add(10, 20); // 方法的返回值可以进行接收 System.out.println("计算结果:" + result); System.out.println("计算结果:

linux shell自定义函数(定义、返回值、变量作用域)介绍

http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以

13 继续C#中的方法,带返回值的方法介绍

在这一个练习中,我们要使用带返回值的方法.如果一个方法带返回值,那么它的形式是这样的. 定义一个带返回值的C#方法 static 返回类型 方法名字 (参数类型 参数1的名字,参数类型 参数2的名字) { 你的代码 return 返回值 } static: 先不用管是什么意思.在没有讲它的含义之前,在你写的每个方法中都要加上它. 返回类型:就是我们前面讲过的数据类型,int,string等等.通常一个方法调用后要给调用这个方法的地方返回一个值. 方法名字:你可以给方法起一个你想要的名字.不能瞎起

Java加载jar文件并调用jar文件当中有参数和返回值的方法

在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成hello.jar文件. 1 package org.lele.fatpanda; 2 3 public class Util 4 { 5 public static String myName; 6 /* 7 * 无参数,无返回值的方法. 8 */ 9 public static void get

Java 中无返回值的方法在使用时应该注意的问题

Java 中的方法是形态多样的.无返回值的方法在使用时应该规避哪些问题呢? 一.不可以打印调用或是赋值调用,只能是单独调用(非常重要): 二.返回值没有,不代表参数就没有: 三.不能return一个具体的值,否则会报错: 四.return分号可以直接省略: 五.无返回值方法应该使用类型void. 原文地址:https://www.cnblogs.com/yanglongbo/p/10981842.html

函数初识:定义,调用,返回值,参数

一 函数的定义,调用,返回值 1.函数的作用: 封装 减少重复代码 2.函数的书写格式 def 关键字 定义一个函数 def 函数名(): 缩进 函数体(代码块) def func(): print('我') print('爱') print('你') return '1314' #返回值,将内容返回给调用者 #不写return或写了return不写值返回None msg = func() #函数名() -- 调用 print(msg) return返回多个变量是,返回的是元祖形式,返回的内容不

函数的定义及其返回值、参数等相关操作

在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下: while True: if cpu利用率 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 内存占用 > 80%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 仔细一看上述代码,i

转 linux shell自定义函数(定义、返回值、变量作用域)介绍

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu