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