C#2010 引用参数与输出参数
引用参数和输出参数是由函数本身的特性而引申出来的两个概念。使用引用参数和输出参数,可以更加灵活地调用函数,并对函数的参数进行快速处理。
1.引用参数
在本章之前提到的所有函数参数通常都具有一个值,这种参数被称作值参数。在调用包含值参数的函数时,程序会将值传递给参数的相应形参,这样,在执行该函数时,对形参的任何改动都不会影响实参的值。
例如,在下面的代码中,定义了一个对逻辑变量进行逻辑非运算的虚函数并通过一个逻辑值作为参数,调用该虚函数。
static void Main(string[] args)
{
bool data = true;
Console.Write(data + ",");
not(data);
Console.Write(data + ",");
}
static void not(bool blData)
{
blData = !blData;
Console.Write(blData + ",");
}//输出:True,False,True
在该程序中,逻辑型变量data作为实参传递给了函数not(),虽然函数not()对该变量进行了逻辑非运算,但从运行的结果可看出,这种预算并未能将改变后的值传递给实参变量data。
由这一函数可得出,值参数不能改变函数的实参数。
如果需要改变函数的实参数,则需要使用引用参数技术。与值参数不同的是,当把一个引用型实参传递给某个函数时,程序将把十几只在内存中的地址传递给引用形参,这是,对形参变量所代表的值的任何更改,都会影响到实参变量所代表的值。也就是说,引用参数能够改变函数的实参数。
要使用引用型参数,需要在编写函数时在参数之前添加ref关键字,同时还需要在调用函数时在参数前同样添加ref关键字,来标识两个参数的引用性质,代码如下。
static void Main(string[] args)
{
bool data = true;
Console.Write(data + ",");
not(ref data);
Console.Write(data + ",");writeline输出数值变量
}
static void not(ref bool blData)
{
blData = !blData;
Console.Write(blData + ",");
}//输出:True,False,False
在使用引用参数时需要注意,作为实参的引用变量必须是经过初始化的变量。C#原则上禁止引用参数在被调用的函数体内进行初始化。例如,下面的代码就是错误的。
bool data
not(ref data);
Console.Write(data);
在上面的代码中,局部变量data本身没有经过初始化,即被not()函数调用,因此在编译时,C#会报出“使用了未赋值的局部变量‘data’”的错误。
2.输出参数
在之前的小节中已介绍过,函数的输入值是参数,输出值是返回值。一个函数只能拥有一个有效的返回值,也就是说一个函数在进行数据操作后,只能输出一个有效的数据。如果开发者需要同时返回多个数据,则必须编写多个函数。
输出参数是一种特殊的参数,其借用了引用参数的部分概念,允许开发者通过函数的参数与外部的代码进行通信,也就是将参数作为函数的输出值与外部代码通信。使用输出参数后,即可通过一个函数输出多个数值。
在使用输出参数时,函数执行后将输出形参的值,返回给与之相对应的输出实参。把未实例化的变量用作引用参数是错误的,但是输出参数却可以使用未实例化的变量。输出参数与引用参数一样需要通过关键字来标识,其标识关键字为out。在以下代码中就定义了一个
包含输出参数的函数。
static int arrMax(int[] arr, out int maxIndex)
{
int max = arr[0];
maxIndex = 0;
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] > max)
{
max = arr[i];
maxIndex = i;
}
}return max;
}
在上面的代码中,函数包含两个参数,一个是输入函数的数组,另一个则是用于输出的数组中最大元素的索引号,因此使用了out关键字,将其标识为输出参数。在使用该函数时,可以先声明一个未实例化的变量作为输出参数,并在函数中引用该变量作为参数,添加out标识,代码如下。
int[] arr = { 35, 44, 79, 25, 14, 36, 25, 27, 22, 16, 98, 42, 103, 29 };
int maxIndex;
int maxValue=arrMax(arr,out maxIndex);
Console.WriteLine(maxValue + "," + maxIndex);//输出:103,12
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论