2010-10-16 57 views
1

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

谢谢。

回答

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美元,他应该得到一个不错的新手表。但是,另一个线程很可能会引用此对象。这意味着他们也可以访问Salary属性,并且可以在if块运行之前将薪水总额改变为100,000美元以上。

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

愚蠢的我知道,但证明了这一点。

+3

更正(因为在我可以编辑您的文章之前,我需要2个更多的代表):“...您将始终传递对同一个实例的引用”。 – dty 2010-10-16 21:38:28

+0

您所说的是当您返回例如'Date'类型时,C#不会自动创建克隆副本。 – Tarik 2010-10-16 21:41:20

+0

@Braveyard:'DateTime'(我假设你指的是)值类型,而不是引用类型。 – 2010-10-16 21:52:24

相关问题