摘自--MSDN的
技术
文档
[URL]http://www.microsoft.com/china/msdn/library/langtool/vcsharp/Usgettingstartedcsharpforjava.mspx?mfr=true
在 C# 中,所有
参数
在默认情况下都是通过值传递的。要通过引用进行传递,我们需要指定关键字 ref 或 out 中的一个。这两个关键字的不同之处在于参数的初始化。ref 参数必须在
使用
前进行初始化,而 out 参数无需在传递前进行显式初始化,并且任何先前的值都会被忽略。
请注意,当
方法
将引用类型作为参数使用时,引用本身是通过值传递的。然而,引用仍然指向内存中的同一对象,因此对对象的属性所做的任何改变在方法退出之后将保持不变。但是,因为引用本身是通过值传递的,所以在方法内它应该改为指向一个不同的对象甚至一个新对象,而一旦方法执行完毕,引用就会恢复为指向原来的对象,即使原来的对象是未赋值的也同样如此。
=====================
做如下解释:
引用传参与值传参
引用对象与引用值,四种可自由组合。
RequestInfo objA = new RequestInfo("1", "a");
//RequestInfo returnB = OjbRef(ref objA);
RequestInfo returnC = OjbRef(objA);
private RequestInfo OjbRef(ref RequestInfo par)
{
par.CurrencyCode = "2";
par.CurrencyName = "b";
par = new RequestInfo("3", "c"); //指向新的对象, 方法执行完毕,引用就会恢复为指向原来的对象(类似互相引用,双引用,在退出方法前,原指针也指向新的par指针)
return par;
}
private RequestInfo OjbRef(RequestInfo par)
{
par.CurrencyCode = "2";
par.CurrencyName = "b";
par = new RequestInfo("3", "c"); //指向新的对象, 方法执行完毕,copy后的引用指向别处,(单引用)
return par;
}
引用及值的传递全部都是在栈上操作,引用传参是指向的栈中的对象(指针的指针),值传递是指向的堆中的对象(与原指针一样)
浅copy只复制栈上面的值(第一级指针),而深复制而复制所有(堆栈),此待确认