【问题标题】:Do methods which return Reference Types return references or cloned copy?返回引用类型的方法是否返回引用或克隆副本?
【发布时间】:2010-10-16 21:31:21
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: c# java accessor


    【解决方案1】:

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

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

    一个愚蠢的例子:

    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 美元,他应该得到一块漂亮的新手表。但是,很有可能另一个线程引用了这个Employee 对象。这意味着他们还可以访问 Salary 属性,并且可以在 if 块运行之前将工资总额更改为 100,000 美元以上。

    在这种尴尬的情况下,即使 Raise() 方法只被调用一次,员工也会得到升职和新办公室。

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

    【讨论】:

    • 更正(因为我还需要 2 个代表才能编辑您的帖子!):“...您将始终传递对同一实例的引用”。
    • 您的意思是当您返回例如“日期”类型时,C# 不会自动创建克隆副本。
    • @Braveyard: DateTime(我假设您指的是)是值类型,而不是引用类型。
    • @dty - 一些代表给你,措辞已经改变:)
    • 是的,我的意思是像'Stream'这样的引用类型
    猜你喜欢
    • 2019-09-06
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2012-08-20
    • 2017-09-30
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多