C#委托 — 调用带引用参数的委托

一、调用带引用参数的委托

二、调用带值参数返回值的委托

三、总结


C#中方法的参数有值参数、引用参数类型、输出参数等类型,下面我们直接上代码,看懂调用带引用参数的委托和调用带值参数的委托。


一、调用带引用参数的委托

如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变,在调用委托列表中的下一个方法时,参数的新值(不是初始值)回传给下一个方法。

/*
  时间:2018年11月14日13点44分
  目的:调用带引用参数的委托
*/

using System;

delegate void Mydel(ref int x);

class Myclass
{
    public void Add2(ref int x)        //这里它会改变参数x的值
    {
        x += 2;
    }
    public void Add3(ref int x)        //这里也会改变参数x的值
    {
        x += 3;
    }

    static void Main()
    {
        Myclass myclass = new Myclass();

        Mydel mydel = myclass.Add2;
        mydel += myclass.Add3;
        mydel += myclass.Add2;

        int x = 5;
        mydel(ref x);

        Console.WriteLine("{0}", x);
        Console.ReadKey();
    }
}


/* 程序运行结果
--------------------------------
    12
--------------------------------
*/

二、调用带值参数返回值的委托

调用这种值类型的委托,调用列表的最后一个方法返回的值就是委托调用返回的值,调用列表中所有其他方法的返回值都会被忽略。

/*
  时间:2018年11月14日13点51分
  目的:调用带值类型返回值参数的委托
*/

using System;

delegate int Mydel(int x);

class Myclass
{
    public int Add2(int x)
    {
        return x += 2;
    }
    public int Add3(int x)
    {
        return x += 3;
    }

    static void Main()
    {
        Myclass myclass = new Myclass();

        Mydel mydel = myclass.Add2;
        mydel += myclass.Add3;
        mydel += myclass.Add2;

        int x = 5;

        Console.WriteLine("{0}", mydel(x));        //输出结果是7,返回值是方法列表最后一个方法的返回值
        Console.WriteLine("{0}", x);
        Console.ReadKey();
    }
}


/* 程序运行结果
--------------------------------
    7
    5
--------------------------------
*/

下面还有一个例子和前面这个例子对比。

/*
  时间:2019年1月19日11点40分
  目的:调用带值类型返回值参数的委托(对象内变量变化了)
*/

using System;

delegate int Mydel();

class Myclass
{
    public int x = 5;

    public int Add2()
    {
        x += 2;
        return x;
    }
    public int Add3()
    {
        x += 3;
        return x;
    }

    static void Main()
    {
        Myclass myclass = new Myclass();

        Mydel mydel = myclass.Add2;
        mydel += myclass.Add3;
        mydel += myclass.Add2;

        Console.WriteLine("{0}", mydel());        //输出结果是12,也是方法列表最后一个的返回值,但是由于这里对象内的自己的变量会随着委托内函数的执行变化,因此这里也是12
        Console.WriteLine("{0}", myclass.x);      //输出结果是12
        Console.ReadKey();
    }
}


/* 程序运行结果
--------------------------------
    12
    12
--------------------------------
*/

 

 

三、总结

如果前面了解过带值参数的方法和带引用参数的方法,理解起来会简单许多。委托执行一系列函数方法,两种情况如下:

1. 在值参数中,我们知道,无论在函数里对值参数进行了什么操作,在是在栈中赋值值参数进行操作,都不会改变值参数的值,因此在值参数中第一种情况下,每个函数都是使用最初的参数值,委托返回最后一个函数的返回值,所以结果是7。

2. 在引用参数中,我们知道,函数方法内部会改变方法引用类型参数的值,因此上一个方法改变了参数的值,这个参数就会有一个新值(肯定不是初始值),而下一个方法会使用这个新值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值