C#方法参数传递-同时使用ref和out关键字

在方法参数传递中,可以同时使用ref和out关键字,但是要注意ref和out参数传递的不同。

using System;

class Program

{

static void Main()

{

Program obj = new Program();

int score = 55; //声明原来分数

int refscore, outscore; //声明两个变量

obj.ChangeScore(score, ref refscore, out outscore);

Console.WriteLine("您原来的分数是{0},调整后的分数为{1},加平时表现分后{2}",

score, refscore, outscore);

Console.ReadKey();

}

private void ChangeScore(int score, ref int refscore, out int outscore)

{

if (score > 50 && score < 60)

{

refscore = 60;

}

if (refscore > 60)

{

outscore = refscore + 5;

}

}

}

以上代码编译时会出现两个错误,我们只声明了变量refscore,并没有给变量显示赋值。所以出现第一个错误:使用了未赋值的局部变量“refscore”。out关键字传递参数时,必须被调用方法内修改参数,用if语句判断,只有符合条件的out参数赋值,不符合条件的out参数没有赋值,所以出现了“控制离开方法之前必须对out参数outscore赋值”错误。

using System;

class Program

{

static void Main()

{

Program obj = new Program();

int score = 55; //声明原来分数

int refscore = 0, outscore; //声明两个变量

obj.ChangeScore(score, ref refscore, out outscore);

Console.WriteLine("您原来的分数是{0},调整后的分数为{1},加平时表现分后{2}",

score, refscore, outscore);

Console.ReadKey();

}

private void ChangeScore(int score, ref int refscore, out int outscore)

{

if (score > 50 && score < 60)

{

refscore = 60;

}

if (refscore > 60)

{

outscore = refscore + 5;

}

else

{

outscore = refscore;

}

}

}

以下内容供参考:

一、值参数与引用参数及输出参数的区别:

1、值参数中实参的值不随形参值变更而变更;

形参与实参值互不影响,实参传递给形参时,栈中就为其分配另外一部分空间。这样,两个参数变更时而互不影响。

2、引用参数及输出参数中实参的值会随形参值变更而变更;

(形参:在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数中形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。调用时将实参的值赋绐形参);

引用参数与输出参数中,实参在栈中分配空间。当实参传递给形参时,会将地址传递给形参,即传送的指针,这样形参变更时,实参也会随著变更。

二、引用参数与输出参数区别:

1、使用ref与out参数时,方法中参数及调用参数都需要加Ref或out关键字。

2、使用ref参数与out参数得到的结果是一样的,区别是:ref在调用前需给调用方法中的参数赋初值。out在调用前不需给调用方法中的参数赋初值,参数在实际方法体中初始化。