classProgram{staticvoidMain(string[] args){int y =1;IWantSideEffect(ref y);
Console.WriteLine(y);//输出为101//方法的参数(x)指向的内存地址,和方法外部的变量(y)指向的内存地址,是同一个地址。//当在方法内部改变了地址上的值时(x=x+100),方法外部的变量所指向内存地址的值就已经改变了。//此时通过外部变量去访问内存地址中的值时,拿到的就是更新之后的值。}staticvoidIWantSideEffect(refint x){
x = x +100;}}
引用类型
classProgram{staticvoidMain(string[] args){Student outterstu =newStudent(){ Name ="Tim"};
Console.WriteLine("HashCode={0},Name={1}", outterstu.GetHashCode(), outterstu.Name);//方法外部的变量当前引用的对象的HashCode和Name属性的值
Console.WriteLine("--------------------------------");IWantSideEffect(ref outterstu);//方法体里打印出来的HashCode和Name属性的值
Console.WriteLine("HashCode={0},Name={1}", outterstu.GetHashCode(), outterstu.Name);//再次打印方法外部的变量的HashCode和Name属性的值//参数和方法外部这个变量所引用的对象,他们是同一个对象,而且是方法体内部创建的新的对象。}staticvoidIWantSideEffect(refStudent stu)//引用类型的引用参数{
stu =newStudent(){ Name ="Tom"};
Console.WriteLine("HashCode={0},Name={1}",stu.GetHashCode(),stu.Name);}}classStudent{publicstring Name {get;set;}}
classProgram{staticvoidMain(string[] args){Student outterStu =newStudent(){ Name ="Tim"};
Console.WriteLine("HashCode={0},Name={1}", outterStu.GetHashCode(), outterStu.Name);
Console.WriteLine("--------------------------------------");SomeSideEffect(ref outterStu);
Console.WriteLine("HashCode={0},Name={1}", outterStu.GetHashCode(), outterStu.Name);//SomeSideEffect中的参数stu和变量outterStu,他们所指向的内存地址是同一个内存地址,//而这个内存地址所存储的,就是对象在堆内存中的地址。}staticvoidSomeSideEffect(refStudent stu){
stu.Name ="Tom";
Console.WriteLine("HashCode={0},Name={1}",stu.GetHashCode(),stu.Name);}}classStudent{publicstring Name {get;set;}}