作用:
在一个方法中,通常传入的参数,是原值的Copy的副本。当这个方法执行完毕之后,这个副本就会被销毁,原值不受影响。
但是有的时候,我们需要改变这个变量的原值,就需要向方法传递这个变量的引用。我们知道值类型修改原值的副本,但是指向引用类型时修改的就是原值。这个时候我们需要使用ref和out这两个关键字。
ref和out的区别:
ref: 通过ref传递到方法的参数必须先初始化(赋值);
out:通过out传递到方法的参数可以不必赋值;
共同点:在一定程度上解决了一个函数只能有一个返回值的问题。
ref代码示例:
static void Main(string[] args)
{
double salary = 5000;//基本工资
JiangJin(ref salary);//这里的salary必须赋初值
Console.WriteLine("奖励500后为{0}", salary);
FanKuan(ref salary);
Console.WriteLine("罚款1000后为{0}",salary);
Console.ReadKey();
}
/// <summary>
/// 求奖金
/// </summary>
/// <param name="salary">基本工资</param>
/// <returns>奖金</returns>
static void JiangJin(ref double salary)
{
salary += 500;//奖金为基本工资+500 同为 salary+=500;
}
/// <summary>
/// 求罚款
/// </summary>
/// <param name="salary">基本工资</param>
/// <returns>罚款</returns>
static void FanKuan(ref double salary)
{
salary -= 1000;
}
上面的代码中我们发现,尽管JiangJi()方法中传入的是原值,但是打印的却是方法中已经改变后的值,这个就是ref的作用。
out代码示例:
static void Main(string[] args)
{
int age=26, lastAge, beforeAge;
GetValue(26, out lastAge, out beforeAge);//这里的参数可以不用赋初值
Console.WriteLine("年龄为{0}的话,去年年龄是{1}岁,明年年龄为{2}岁!!!", age, beforeAge, lastAge);
Console.ReadLine();
}
/// <summary>
/// 获取比传入年龄的小1岁和大1岁的年龄
/// </summary>
/// <param name="age">当前年龄</param>
/// <param name="lastAge">小1岁</param>
/// <param name="beforeAge">大1岁</param>
public static void GetValue(int age,out int lastAge,out int beforeAge)
{
lastAge = age + 1;
beforeAge = age - 1;
}
通过上面的代码,我们除了可以返回小一岁的年龄,还可以返回大一岁的年龄,这个就是out的作用。