我这些天一直在学习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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,让我们说这家伙的工资是50,000美元,只是加薪了.现在他的工资是62,500美元,他应该得到一块漂亮的新手表.但是,另一个Thread很可能具有对此Employee对象的引用.这意味着他们也可以访问该Salary属性,并且可以在if块运行之前将工资总额更改为100,000美元以上.
在这个尴尬的场景中,即使该Raise()方法仅被调用一次,员工也将获得晋升和新办公室.
傻我知道,但证明了这一点.