让我说我有一个班级:
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#中有哪些选项。
答案 0 :(得分:4)
// MakeObject可以在此MyClass实例上调用GetObject
这是你的根本问题。而不是尝试使这项工作,在这里修复您的解决方案的设计。
让我们说,MyClass可能会被要求提供一个对象'x',其成员包含引用'x'的成员。
没问题,只要这些成员被第二次实例化。
简而言之,似乎没有理由在这里使用递归。如果你认为有,那就试着让它(很多)更清晰。
C#中有'占位符'这样的东西吗?
不是真的。您可以制作自己的包装器,但很难正确使用它。类似于(但不完全是)WeakReference的东西。
答案 1 :(得分:0)
除了Henk Holterman said之外,您可能还需要考虑使用Lazy。
答案 2 :(得分:-1)
为什么不在类BlackBoxObjectMaker中提供静态方法MakeObject()?