2012-05-12 19 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がValue型として渡された場合、それはどうして私に答えとして「2」を与えるのでしょうか?

答えて

8

Func2に関するあなたを取得しているビットは次のとおりです。

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

Employeeは、参照型(クラス)が、参照自体が値によって渡されている - それはです参照のコピー

このコピーに新しい参照を割り当てていますが、オリジナルの参照(コピー元)は変更されませんでした。したがって、あなたは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では、employeeの新しいインスタンスを作成し、そのインスタンスに値を割り当てます。 func1の場合、既に作成されたインスタンスを変更するだけなので、変更は反映されます。

+0

はい私はFunc2で新しいインスタンスを作成していますが、名前プロパティを変更した後、この新しく作成されたインスタンスを既に作成されたインスタンスに割り当てていますので、反映する必要があると思います –