假设我有一个类:
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# 中有哪些选项可用。
最佳答案
// MakeObject may call GetObject on this MyClass instance
这就是你的根本问题。不要尝试使其工作,而是在此处修复解决方案的设计。
Lets also say that, MyClass may be called upon to provide an object, 'x', the members of which contain members that reference 'x'.
没问题,只要第二个实例化这些成员即可。
总之,这里似乎没有理由使用递归。如果您认为有,请尝试使其(更加)清晰。
Is there such thing as a 'placeholder' in C#?
不是真的。您可以制作自己的 wrapper ,但很难获得并正确使用它。类似(但不完全是)弱引用的东西。
关于c# - 如何返回对尚不存在的对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9555662/