用途:
在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out。
正确的使用ref:
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x = 10;
int y = 20;
pg.GetValue(ref x, ref y);
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadLine();
}
public void GetValue(ref int x, ref int y)
{
x = 333;
y = 444;
}
}
错误的使用ref:
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x;
int y; //此处x,y没有进行初始化,则编译不通过。
pg.GetValue(ref x, ref y);
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadLine();
}
public void GetValue(ref int x, ref int y)
{
x = 1000;
y = 1;
}
}
总结:使用ref 必须在 调用方法前 对其进行初识化操作
正确的使用out:
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x = 10;
int y = 233;
Swap(out x, out y);
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadLine();
}
public static void Swap(out int a, out int b)
{
a = 333; //对a,b 在方法内进行了初识化,不会报错
b = 444;
}
}
错误的使用out:
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x = 10;
int y = 233;
pg.Swap(out x, out y);
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadLine();
}
public static void Swap(out int a, out int b)
{
int temp = a; //a,b在函数内部没有赋初值,则出现错误。
a = b; //a,b 没有进行 初始化 ,会报错
b = temp;
}
}
总结:out 的使用必须要在 方法内 进行 初始化 ,才不会报错
口诀:
ref有进有出,out(有出去的意思)只出不进。
相同点:
1、都能返回多个返回值。
2、若要使用 ref 和out参数,则方法定义和调用方法都必须显式使用 ref和out 关键字。在方法中对参数的设置和改变将会直接影响函数调用之处(参数的初始值)。
不同点:
1、ref指定的参数在 函数调用前必须初始化,不能为空的引用。
2、out指定的参数在进入函数时会清空自己,必须在函数内部(即方法中)赋初值。
ref 和 out 本质上都是引用的传递
out 例子
public class Program
{
static void Main(string[] args)
{
string message = "你好!"; //原值
SendMessage(out message);
//使用了out,原值被更改了,
//使用out 必须在方法体内初始化值,在外面可以不用
Console.WriteLine(message);
Console.Read();//将当前窗体保留
}
public static void SendMessage(out string message) {
message = "不好!";
Console.WriteLine(message);
}
}
ref 例子
public class Program
{
static void Main(string[] args)
{
string message = "你好!"; //原值
SendMessage(ref message);
//使用了ref,如果方法内进行了修改,原值就被修改了
//使用ref 必须在 进入 方法前初始化值。
Console.WriteLine(message);
Console.Read();//将当前窗体保留
}
public static void SendMessage(ref string message) {
message = "不好!";
Console.WriteLine(message);
}
}
多个返回值举例(以 ref 为例)
public class Program
{
static void Main(string[] args)
{
string message1 = "你好!";
string message2 = "小明!";
SendMessage(message1,ref message2);
Console.WriteLine(message1); //返回值1
Console.WriteLine(message2); //返回值2
Console.Read();//将当前窗体保留
}
public static string SendMessage(string message1,ref string message2) {
message2 = message2 + "对message2进行处理";
return message1;
}
}
参考博客:https://blog.csdn.net/qq373011556/article/details/81944690