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;}}
引用参数引用形参是用 ref 修饰符声明的形参。与值形参不同,引用形参并不创建新的存储位置。相反,引用形参表示的存储位置恰是在方法调用中作为实参给出的那个变量所表示的存储位置。当形参为引用形参时,方法调用中的对应实参必须由关键字 ref 并后接一个与形参类型相同的 variable-reference组成。变量在可以作为引用形参传递之前,必须先明确赋值。在方法内部,引用形参始终被认为是明确赋值的。声明为迭代器的方法不能有引用形参。值类型 class Program {