1

私は最近 Java を学んでいて、読んだこと"Be careful not to write accessor methods that return references to mutable objects"は本当に興味深いものでした。そして今、C# のプロパティとアクセサ メソッドで同じかどうか疑問に思っていますか? または、C# は既に複製されたコピーを自動的に返しますか?

ありがとう。

4

1 に答える 1

8

参照はまさにそれです...メモリに格納されているオブジェクトへの参照です。クローンを作成してそのオブジェクトへの参照を返すコードを明示的に記述しない限り、常に同じインスタンスへの参照を渡すことになります。

回避させようとしている状況は、依存している呼び出し元にオブジェクト参照を渡すことです。誰が、何がそのオブジェクトの状態を変更するかを制御できないため、クラスは予測できない結果になる可能性があります。

ばかげた例:

public class Employee
{
    public Salary Salary {get; set;}

    public void GiveRaise()
    {
        Salary.Total *= .25;

        if(Salary.Total > 100000)
        {
            Promote();
            GiveBiggerOffice();
        }
        else
        {
            GiveWatch();
        }
    }
}

では、この男の給与が 50,000 ドルで、昇給したばかりだとしましょう。現在、彼の給料は 62,500 ドルで、素敵な新しい時計を手に入れているはずです。ただし、別のスレッドがこのEmployeeオブジェクトを参照している可能性は十分にあります。つまり、彼らもSalaryプロパティにアクセスでき、if ブロックが実行される前に給与合計が $100,000 を超える可能性があります。

この厄介なシナリオでは、Raise()メソッドが 1 回しか呼び出されなかったとしても、従業員は昇進し、新しいオフィスを取得することになります。

愚かなことはわかっていますが、要点を示しています。

于 2010-10-16T21:36:37.197 に答える