【发布时间】:2010-10-16 21:31:21
【问题描述】:
这些天我一直在学习 Java,我读到的只是"Be careful not to write accessor methods that return references to mutable objects",这真的很有趣。现在我想知道 C# 中的 Properties 和 Accessor 方法是否相同?还是 C# 已经自动返回克隆的副本?
谢谢。
【问题讨论】:
这些天我一直在学习 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 美元,他应该得到一块漂亮的新手表。但是,很有可能另一个线程引用了这个Employee 对象。这意味着他们还可以访问 Salary 属性,并且可以在 if 块运行之前将工资总额更改为 100,000 美元以上。
在这种尴尬的情况下,即使 Raise() 方法只被调用一次,员工也会得到升职和新办公室。
我知道很傻,但证明了这一点。
【讨论】:
DateTime(我假设您指的是)是值类型,而不是引用类型。