【发布时间】:2008-11-11 05:42:00
【问题描述】:
我通常是 C# 和 .Net 的新手,所以这可能是一个幼稚的问题。但无论如何,请考虑以下 C# 代码:
class A {
public int Data {get; set;}
}
class B {
public A Aval {get; set;}
}
上面的 B.Aval 属性返回对其内部 A 对象的引用。作为一名前 C++ 程序员,我发现这很危险,因为公开对成员对象类 B 的引用违反了数据隐藏原则。尽管如此,这似乎是 C# 世界的正常做法。
我的问题是,如果有的话,为什么这样的设计是通常的方法,而不是返回内部成员的副本,这在很多方面会更安全(包括线程安全的情况)?
我知道,即使在 C++ 中,有时好的设计也要求您直接公开类成员(具有 Engine 和 Stereo 对象的 Car 类想到里面),但这并不是 C# 中的规范。
【问题讨论】:
-
您的意思是“上面的 B.Aval 属性正在返回对其内部 A 对象的引用”而不是“... B 对象”?
-
在 C++ 中,您通常会编写 B.Aval 的 get 方法,使其复制其内部 A,然后返回该副本吗?
-
没错。在 C++ 中,在 90% 的情况下,get 方法将返回成员变量的副本,而不是引用(或指针)。
-
我想我的意思是您的代码 sn-p 没有说明 C# 中的封装。通常,您要么包装 & 不直接公开内部实例,要么继承 & 可选地覆盖以在 C# 中执行封装。
-
我明白,Steph,但我的问题是,为什么 C# 程序员似乎不关心封装。在 C++ 世界中,封装(即通过复制返回等等)始终是默认设计。对于 C#,为什么返回内部引用是默认方法,尽管它不太安全?