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」でなければなりません-ありがとう

しかし、以下に定義されているFunc1メソッドを呼び出すと:-

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

答えは「2」です。eが値型として渡された場合、どうして答えとして「2」が返されるのでしょうか。

4

3 に答える 3

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オブジェクトを指しています。基になるオブジェクト参照自体ではなく、このオブジェクトの状態を変更しています(プロパティを設定しています)。

于 2012-05-12T19:20:00.533 に答える
2

を呼び出すと、Func2で参照が渡されます。メソッド内に割り当てると、に格納されている値は変更されず、ローカル変数に異なる値が割り当てられるだけです。eempe

参照で渡す場合は、refキーワードを使用します。

Func2(ref emp);

private void Func2(ref Employee e)
{
    // etc... 
}
于 2012-05-12T19:19:39.713 に答える
0

ではfunc2、従業員の新しいインスタンスを作成し、それに値を割り当てています。既に作成されたインスタンスを変更しfunc1ているだけなので、変更が反映されます。

于 2012-05-12T19:55:55.680 に答える