2012-05-12 49 views
4
class Program 
{ 
    static void Main(string[] args) 
    { 
     A a = new A(); 
     a.print(); 

    } 
} 

class Employee 
{ 
    public string Name { get; set; } 
} 

class A 
{ 
    public void print() 
    { 
     Employee emp = new Employee { Name = "1" }; 
     Func2(emp); 

     Console.WriteLine(emp.Name); 
     Console.ReadLine(); 
    } 

    private void Func2(Employee e) 
    { 
     Employee e2 = new Employee { Name = "3" }; 
     e = e2; 

    } 

} 

運行上述程序後,我得到「1」作爲答案,我無法理解如何?誰能解釋,根據我的答案應該是「3」 -Thanks解釋下面程序的輸出?

但是,當我叫其定義如下FUNC1方法: -

private void Func1(Employee e) 
{ 
    e.Name = "2"; 
} 

我得到「2」作爲回答。現在,如果e作爲值類型傳遞,那麼它是如何給我「2」作爲答案?

回答

8

這裏是讓你對於Func2位:

private void Func2(Employee e) 
{ 
    Employee e2 = new Employee { Name = "3" }; 
    e = e2; 
} 

Employee是引用類型(A類),但參考本身是按值傳遞 - 這是一個複製的參考。

然後,您將爲此副本分配一個新的參考,但原始參考(從中複製)未更改。因此,你會得到一個1

如果你通過了參考本身的參考,你可以修改它:

private void Func2(ref Employee e) 
{ 
    Employee e2 = new Employee { Name = "3" }; 
    e = e2; 
} 

以上會產生3,如你預期。


更新,關於你的加入Func1

參考是一個副本,但仍指向相同對象 - 你正在改變這個對象的狀態(設置Name屬性),而不是底層對象引用本身。

2

當您撥打Func2時,它會通過值傳遞參考。在方法內部分配e不會更改存儲在emp中的值,它只會爲本地變量e分配一個不同的值。

如果您想通過參考使用ref關鍵字。

Func2(ref emp); 

private void Func2(ref Employee e) 
{ 
    // etc... 
} 
0

func2您正在創建一個員工的新實例併爲其分配一個值。在func1中,你只是修改一個已經創建的實例,所以這個改變就會反射回來。

+0

是的我在Func2中創建了一個新的實例,但是在更改了name屬性後,我將這個新創建的實例分配給了已經創建的實例,這就是爲什麼我認爲它應該反映 –