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

Tar*_*rik 1 c# java accessor

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

谢谢.

Jos*_*osh 8

引用只是...对存储在内存中的某个对象的引用.除非您明确地编写代码来创建克隆并返回对该对象的引用,否则您将始终传递对同一实例的引用.

它试图让你避免的情况是将对象引用移交给你所依赖的调用者.您无法控制更改该对象状态的人员或内容,因此您的类最终可能会产生不可预测的结果.

一个愚蠢的例子:

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()方法仅被调用一次,员工也将获得晋升和新办公室.

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

  • 更正(因为在我编辑你的帖子之前我还需要2个代表!):"......你将永远传递对同一个实例的引用". (3认同)