这些天我一直在学习 Java,我所读到的"Be careful not to write accessor methods that return references to mutable objects"
内容真的很有趣。现在我想知道 C# 中的 Properties 和 Accessor 方法是否相同?还是 C# 已经自动返回克隆的副本?
谢谢。
引用就是……对存储在内存中的某个对象的引用。除非您明确编写代码来创建克隆并返回对该对象的引用,否则您将始终传递对同一实例的引用。
它试图让您避免的情况是将对象引用移交给您所依赖的调用者。您无法控制谁或什么可能会改变该对象的状态,因此您的类最终可能会产生不可预知的结果。
一个愚蠢的例子:
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()
方法只调用了一次,员工也会得到升职和新办公室。
我知道很傻,但证明了这一点。