如何返回对尚不存在的对象的引用?

时间:2012-03-04 14:28:28

标签: c# .net design-patterns reference

让我说我有一个班级:

    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#中有“占位符”这样的东西吗?

A likely duplicate, but apart from Will A's comment I cannot see anything as relevant to the context in this question

额外信息:

这是序列化工具的一部分,旨在支持循环引用。在这种特殊情况下,可以重新编写工具,以便在填充其属性(并且需要引用)之前可以对对象进行引用,正如Henk Holterman所说;但我想回答这个问题,比如说当BlackBoxObjectMaker 真的是黑盒子的时候。
这在C ++中是微不足道的,所以我很好奇C#中有哪些选项。

3 个答案:

答案 0 :(得分:4)

  

// MakeObject可以在此MyClass实例上调用GetObject

这是你的根本问题。而不是尝试使这项工作,在这里修复您的解决方案的设计。

  

让我们说,MyClass可能会被要求提供一个对象'x',其成员包含引用'x'的成员。

没问题,只要这些成员被第二次实例化。

简而言之,似乎没有理由在这里使用递归。如果你认为有,那就试着让它(很多)更清晰。

  

C#中有'占位符'这样的东西吗?

不是真的。您可以制作自己的包装器,但很难正确使用它。类似于(但不完全是)WeakReference的东西。

答案 1 :(得分:0)

除了Henk Holterman said之外,您可能还需要考虑使用Lazy

答案 2 :(得分:-1)

为什么不在类BlackBoxObjectMaker中提供静态方法MakeObject()?