返回引用类型的方法是返回引用还是克隆副本?

时间:2010-10-16 21:31:21

标签: c# java accessor

我这些天一直在学习Java,而我所读到的只是"Be careful not to write accessor methods that return references to mutable objects"这真的很有趣。现在我想知道C#中的Properties和Accessor方法是否相同?或者C#已经自动返回克隆的副本?

感谢。

1 个答案:

答案 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()方法只被调用一次,员工也会获得晋升和新办公室。

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