1

这些天我一直在学习 Java,我所读到的"Be careful not to write accessor methods that return references to mutable objects"内容真的很有趣。现在我想知道 C# 中的 Properties 和 Accessor 方法是否相同?还是 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()方法只调用了一次,员工也会得到升职和新办公室。

我知道很傻,但证明了这一点。

于 2010-10-16T21:36:37.197 回答