我一直在閱讀了一下MSDN上的教程,讓我的頭周圍傳遞通過引用在C#out
,ref
並和我遇到下面的代碼示例來了:傳遞通過引用和參考
using System;
class TheClass
{
public int x;
}
struct TheStruct
{
public int x;
}
class TestClass
{
public static void structtaker(TheStruct s)
{
s.x = 5;
}
public static void classtaker(TheClass c)
{
c.x = 5;
}
public static void Main()
{
TheStruct a = new TheStruct();
TheClass b = new TheClass();
a.x = 1;
b.x = 1;
structtaker(a);
classtaker(b);
Console.WriteLine("a.x = {0}", a.x); //prints 1
Console.WriteLine("b.x = {0}", b.x); //prints 5
}
}
從教程的說明到此:
本實施例表明當結構被傳遞給一個方法中, 副本結構被傳遞,但是當一個類的實例被傳遞,參考 是通過。
我完全理解它,但我的問題是,如果引用在C#中傳遞給參數,爲什麼他們需要ref
如下面的示例所示:
void tearDown(ref myClass a)
{
a = null;
}
MyClass b = new MyClass();
this.tearDown(ref b);
assert(b == null);
//b is null
???我認爲C在C中是一樣的 - 按值傳遞。
僅僅因爲它是一個引用類型,並不意味着它通過引用傳遞。除非明確使用'ref',否則傳遞是有價值的。 –
@JeroenVannevel是的,傳遞是默認值,但傳遞的值是引用類型的引用。 – MarcinJuraszek
部分'MyClass b = new MyClass();'創建2個內存:引用變量'b'和堆上的匿名實例。引用變量的行爲完全像一個值類型(例如'int')。 –