陷阱??觀念
class Employee
{
public int Age;
public string Name;
public Employee(string name, int age)
{
Age = age;
Name = name;
}
}
private delegate void testEmployee(Employee arg);
private static void TestEmployee()
{
testEmployee test;
Employee emp = new Employee("cloudio", 28);
test = delegate(Employee arg)
{
arg.Name = "test";
};
test(emp);
MessageBox.Show(emp.Name);
test = delegate(Employee arg)
{
Employee newEmp = new Employee("new emp", 88);
arg = newEmp;
};
test(emp);
MessageBox.Show(emp.Name);
}
看到這樣的東西我想大多數的人會覺得第12行應該是show出cloudio這段字
(因為沒有加ref,所以是傳值,照理說不會影響到method之外的emp)
錯!!
但是實際上跑起來卻不是這樣
事實上在第12行會show出的是test。
OK!既然看起來似乎參考型別傳進method會傳參考進去
所以參考型別的參數存放的是記憶體的位址,而不是實體物件
那麼19行應該是show出new emp才對吧
(因為傳參照的話我在method把他指向新的instance了)
又錯!!!
到底是怎樣阿,這麼讓人摸不著頭緒
可是把Employee改成struct的話跑起來又都是顯示cloudio
就符合數值型別看起來像是傳一份新的副本進method,怎樣改都改不到外面這份了
其實不是
參考型別一樣是傳值進去
但是他傳的值是參照(記憶體位址)這個值,而不是參照所指向的實體物件。
so下次不要再認為沒有加ref在method中就可以對物件動手動腳囉XD