我这些天一直在学习Java,而我所读到的只是"Be careful not to write accessor methods that return references to mutable objects"
这真的很有趣。现在我想知道C#中的Properties和Accessor方法是否相同?或者C#已经自动返回克隆的副本?
感谢。
答案 0 :(得分: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美元,他应该得到一块漂亮的新手表。但是,另一个Thread很可能引用了这个Employee
对象。这意味着他们也可以访问Salary
属性,并且可以在if块运行之前将工资总额更改为100,000美元以上。
在这个尴尬的场景中,即使Raise()
方法只被调用一次,员工也会获得晋升和新办公室。
我知道傻了,但是证明了这一点。