为公益组织做网站/网络视频营销平台
public static void ChaneA(A a){a.X= 2;}
Main()方法创建类型A的实例,把X初始化为1,调用ChangeA方法:static void Main(){ Aa1 =
Console.WriteLine($”a1.X:{a1.X}”);
输出是什么?1还是2?答案视情况而定。需要知道A是一个类还是结构。类和结构①.假定A是结构(值类型参数)
public struct A{ publicint X{get;set;}}
我们知道结构按值传递,通过值传递,ChangeA方法中的变量a得到堆栈中变量a1的一个副本。在方法ChangeA中修改并销毁副本。a1的内容从不改变,一直是1。②.假定A是类(引用类型参数)
public class A{ public int X{get;set;}}
类是按引用传递。a变量把堆上的同一个对象引用为变量a1。当ChangA修改a的X属性值时,把它改为a1.X,因为它是同一个对象。这里,结果是2。ref参数①.值类型如果A是结构类型,就添加ref修饰符,修改ChangeA方法的声明,通过引用传递变量:
publicstatic void ChangeA(ref A a){ a.x = 2;}
从调用端也可以看出这一点,所以给方法参数应用了ref修饰符后,在调用方法时需要添加它:
Staticvoid Main(){
A a1 = new A{X = 1};
ChangeA(ref a1);
Console.WriteLine($”a1.X:{a1.X}”);
}
由于结构也按引用类型传递,所以结果是2。
②.引用类型如果A是类类型,修改ChangeA方法
publicstatic void ChangeA(ref A a){
a.X = 2;
a= new A{X = 3};
}
把A作为类类型,使用ref修饰符,传递对引用的引用,它允许分配一个新对象,Main()方法显示了结果3。
out参数Out关键字通过引用传递参数,若要使用out参数,方法定义和调用方法均必须显示使用out关键字,例如:Stringinput1 = ReadLine();
If(int.TryParse(input1,outint result1))
{
Console.WriteLine($”result:{result1}”);
}
else
{
Console.WriteLine(“not a number”);
}
注意:作为out参数传递的变量在方法调用中传递之前不必进行初始化。但是,被调用的方法需要在返回之前赋一个值。点击【参与讨论】一起聊聊吧!
