返回引用类型的方法是返回引用还是克隆副本?
我这些天一直在学习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美元,他应该买一块漂亮的新手表。 但是,另一个Thread很可能具有对此Employee
对象的引用。 这意味着他们也可以访问Salary
属性,并且可以在if块运行之前将工资总额更改为$ 100,000以上。
在这个尴尬的场景中,即使Raise()
方法只调用一次,员工也会获得升级和新办公室。
傻我知道,但certificate了这一点。