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

标签 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# 中有哪些选项可用。

最佳答案

// 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/

相关文章:

c# - 在负载平衡环境中将 javascript/css 请求定向到与页面相同的服务器

c# - 将字符串转换为异常

c# - 发现 op_Addition 或实现 Expression.Add 的方法

java - 为单个术语和复合术语创建搜索过滤器的最有效方法是什么?

java - java中的多重继承和方法覆盖问题

java - Java 与 C# 中不同的 UTF-16 编码

c# - IEnumerable<T> 和 IQueryable<T> 的通用方法

.net - WPF在多显示器上显示数据

c# - 如何将中间件添加到.net 6中的worker项目中?

c# - 在C#中使用继承类作为实例List