Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何返回对尚不存在的对象的引用?_C#_.net_Design Patterns_Reference - Fatal编程技术网

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

C# 如何返回对尚不存在的对象的引用?,c#,.net,design-patterns,reference,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 t

假设我有一门课:

    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尚未完成的对象的引用

我如何在引用对象之前提供对该对象的引用?C语言中有“占位符”这样的东西吗?

额外资料:

这是用于支持循环引用的序列化工具的一部分。在这种特殊情况下,可以重新写入工具,以便在填充对象的属性之前获取对对象的引用(并且需要引用),如Henk Holterman所说;但是我想回答这个问题,比如说BlackBoxObjectMaker实际上是一个黑匣子。
在C++中,这将是微不足道的,所以我很好奇C选项中有哪些选项。 //MakeObject可以在此MyClass实例上调用GetObject

这是你的根本问题。不要试图让它工作,而是在这里修改解决方案的设计

也就是说,可以调用MyClass来提供一个对象“x”,该对象的成员包含引用“x”的成员

没问题,只要这些成员是第二个实例化的

简而言之,这里似乎没有理由使用递归。如果你认为有,试着把它弄清楚

C#中有“占位符”这样的东西吗


不是真的。你可以做你自己的包装,但很难得到和正确使用它。类似于(但不完全是)软引用

>P>除此之外,您可能还想考虑使用.

为什么不在类BLASBBOX ObjutMeks/< P>类中提供静态方法MaMo对象()。问题在于设计。如果消费者可以在设置对象之前引用它,那么消费者需要准备好处理对象为空的情况。@Henk和Bob,我已经为问题添加了更多细节-我也同意我的“真正”问题将通过重新设计得到解决,但我仍然想知道,这种语言是否有一个我不知道的特点——仅仅因为你知道一种方法,就不能成为停止学习的借口;)@sebf您提到这是序列化工具的一部分。如果在该工具需要该属性时,该属性尚未设置,那么使用指向该属性的指针有何帮助?是不是已经太晚了?@Bob,该工具将需要该属性,只需将“当前反序列化”对象的属性设置为该属性即可。也就是说,在C++中,你可以有一个对象,它是指向其他东西的指针——你可以设置这个成员,而不知道它会是什么,只要你知道它将在哪里(或者,至少在哪里可以移动它…)@ SEBF在托管代码中就没有“哪里”。对象可以在垃圾回收器(除了对象之外)的内存中移动,在C++中它是如何微不足道的?我很难看到。“亨克好,也许琐碎是一个太强的词,但是C++中的AbObjor是一个指针,我可以在初始化完成之前返回它,当Objter完成了AbObjor的‘真实’实例时,我会把它复制到我所发出的原始AbObor指针指向的内存中。(我知道这使得文章中没有详细的假设,但我问了一个C#特性,并试图将它提炼成最简单的例子,希望它能被原谅!)