cloudio™

知識要用心體會 才能變成智慧

最新回應

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

 

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

 

傳遞參考型別的參數

2009/12/22 02:49| 閱讀數 : 348 | 我要推薦 | 4 Comments | 文章分類: C# 訂閱

DotBlogs Tags: C#


關連文章

回應

  • horngsh 2009/12/22 上午 10:57 回覆

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

    test = delegate(Employee arg)這裡的arg參數應屬於方法中的區域性參考變數, 一離開test方法後就自動被毀滅掉了, 所以在呼叫完test(emp)後, 再顯示emp的值, 這時取得的是test方法外面的emp物件.
  • cloudio 2009/12/22 下午 11:28 回覆

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

    to horngsh :
    照您的說法12行顯示的還是cloudio吧
    還是您是其他意思呢?
    delegate要改成一另外寫method?
    不太懂,可以請您說清楚點讓小弟確認嗎
    謝謝:)

  • Sam 2009/12/23 上午 05:29 回覆

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

    阿...我答錯第二個了, 看了觀念還有待加強@@

  • cloudio 2009/12/23 下午 01:29 回覆

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

    to Sam :
    我問的結果回答正確的比例也不高XD

標題 *
名稱 *
Email (將不會被顯示)
Url
回應
登入後使用進階評論
Please add 3 and 5 and type the answer here: