(ref,out)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyBlog
{
class REFOUTTO
{
public void Add(int a)
{
Console.WriteLine("Add:" + a);
}
public void Add1(ref int a)
{
a = a + 5;
Console.WriteLine("Add1:"+a);
}
public void Add2(out int a)
{
a = 20 ;
Console.WriteLine("Add2:"+a);
}
}
class Program
{
static void Main(string[] args)
{
int a=10;
REFOUTTO valueParms = new REFOUTTO();
valueParms.Add(5); //5 Main 方法里面的a= 10不会随着方法的结果而改变
Console.WriteLine("Main" + a);//10 Main 方法里的属性(int a=10)
valueParms.Add1(ref a);//15 ref传值时必须在传参前赋值所以此处保留了a的初始值(int a=10) 引用了Add1的方法里的赋值(a=a+5)a=10(int a=10)+5 即使方法里没有赋值返回的也是初始值(a=10)
Console.WriteLine("Main" + a);//15 实际上把a的地址传进来了会把方法里得到的结果(a=15)带给Main方法里的属性(实参)
valueParms.Add2(out a); //20 参数out不接受外部的数据(把外部的地址传进来),在内部进行初始化,并把方法的结果(a=20)返回带给实参 所以out传参必须在返回前赋值
Console.WriteLine("Main" + a);//20
Console.ReadKey();
}
}
总结:
ref:
1,使用ref必须在参数声明和调用的时候都带上ref关键字
2,只能修饰变量,不能修饰常量
3,ref在方法中可以对ref修饰的值不改变,但是在传参前必须给参数赋值,所以在传递过程中保留了初始值,一般都是把外部的值传入到方法中使用并修改
4,ref的特点侧重于改变和修改值
out:
1,out在传参前不必给参数赋值,但是在返回前必须给参数赋值,一般都是传递变量进入某个方法中接收数据
2,out在传参过程中不保留初始值
2,out的特点侧重于输出
共同点:
ref和out都是把值传递改为引用传递,传递值类型的变量的地址