【发布时间】:2012-03-04 14:28:28
【问题描述】:
假设我有一门课:
class MyClass
{
object AnObject;
public object GetObject(BlackBoxObjectMaker ObjMaker)
{
if(AnObject == null)
AnObject = ObjMaker.MakeObject(); //MakeObject may call GetObject on this MyClass instance
return AnObject;
}
}
谁的工作是通过 GetObject() 使用 BlackBoxObjectMaker“按需”创建对象并提供对对象的访问。
还可以说,可以调用 MyClass 来提供对象“x”,其成员包含引用“x”的成员。
在这种情况下,GetObject() 最终会在同一个 MyClass 实例上调用自身,从而导致堆栈溢出。
可以修改 MyClass 以检测 GetObject() 何时在同一实例上调用自身,但在这种情况下,GetObject() 如何返回对 BlackBoxObjectMaker 尚未完成的 AnObject 的引用?
如何在引用某个对象之前提供对该对象的引用? C# 中是否有“占位符”之类的东西?
额外信息:
这是序列化工具的一部分,旨在支持循环引用。正如 Henk Holterman 所说,在这种特殊情况下,可以重新编写工具,以便在填充对象属性之前获取对对象的引用(并且需要引用);但我想回答这个问题,比如当 BlackBoxObjectMaker 真的是是一个黑盒子的时候。
这在 C++ 中是微不足道的,所以我很好奇 C# 中有哪些可用选项。
【问题讨论】:
-
在 C++ 中怎么会是微不足道的?我很难看到。
-
@Henk 好吧,也许微不足道这个词太强了,但在 C++ 中 AnObject 将是一个指针,我可以在初始化完成之前返回,并且当 ObjMaker 完成构建 AnObject 的“真实”实例时我会将它复制到我分发的原始 AnObject 指针所指向的内存中。 (我知道这使帖子中没有详细说明假设,但我在询问 C# 功能并试图将其提炼为最简单的示例案例,所以希望它会被原谅!)
标签: c# .net design-patterns reference