首先是不包含ref与out的代码示例:
static void Main(string[] args)
{
int a = 6;
int b = 66;
Fun(a, b);
Console.WriteLine("Main内的a:{0},Main内的b:{1}", a, b);
}
static void Fun(int a, int b)
{
a = a + b;
b = 6;
Console.WriteLine("Fun里的a:{0},Fun里的b:{1}", a, b);
}
运行结果:
接下来使用ref关键字
(1)、使用ref关键字的注意点:
i、方法定义和调用方法都必须显式使用 ref 关键字
ii、传递到 ref 参数的参数必须初始化,否则程序会报错
iii、通过ref的这个特性,一定程度上解决了C#中的函数只能有一个返回值的问题
static void Main(string[] args)
{
int a = 6;
int b = 66;
Fun(ref a, ref b);
Console.WriteLine("Main内的a:{0},Main内的b:{1}", a, b);
}
static void Fun(ref int a, ref int b)
{
a = a + b;
b = 6;
Console.WriteLine("Fun里的a:{0},Fun里的b:{1}", a, b);
}
运行结果:
接下来使用out关键字
(2)、out关键字
(1)、使用out关键字的注意点:
i、方法定义和调用方法都必须显式使用 out关键字
ii、out关键字无法将参数值传递到out参数所在的方法中,只能传递参数的引用(个人理解),所以out参数的参数值初始化必须在其方法内进行,否则程序会报错
iii、通过out的这个特性,一定程度上解决了C#中的函数只能有一个返回值的问题
static void Main(string[] args)
{
int a = 100;
int b;
Fun(out a, out b);
Console.WriteLine("Main内的a:{0},Main内的b:{1}", a, b);
}
static void Fun(out int a, out int b)
{
a = 1 + 2;
b = 1;
Console.WriteLine("Fun里的a:{0},Fun里的b:{1}", a, b);
}
运行结果:
(3)、ref和out的区别
通过上面的解析,ref和out最主要的区别是:
ref将参数的参数值和引用都传入方法中,所以ref的参数的初始化必须在方法外部,进行,也就是ref的参数必须有初始化值,否则程序会报错
out不会将参数的参数值传入方法中,只会将参数的引用传入方法中,所以参数的初始化工作必须在其对用方法中进行,否则程序会报错