陷阱??觀念(參考型別的參數)

  • 3760
  • 0
  • C#
  • 2009-12-29

陷阱??觀念

 

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

 

傳遞參考型別的參數