Как я могу вернуть ссылку на объект, который еще не существует? - PullRequest
2 голосов
/ 04 марта 2012

Допустим, у меня есть класс:

    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;
        }
    }

Чья работа заключается в создании и предоставлении доступа к объектам с помощью BlackBoxObjectMaker «по требованию» через GetObject ().

Позвольте также сказать, что MyClass может быть вызван для предоставления объекта 'x', члены которого содержат члены, которые ссылаются на 'x'.

В этом случае GetObject ()в конечном итоге вызовет себя для того же экземпляра MyClass, что приведет к переполнению стека.

MyClass может быть изменен для определения, когда GetObject () вызывает себя для того же экземпляра, но в этом случае, как может GetObject () вернуть ссылку на AnObject, что BlackBoxObjectMaker еще не закончил?

Как я могу предоставить ссылку на объект, прежде чем у меня будет ссылка на этот объект?Есть ли такая вещь, как «заполнитель» в C #?

Вероятный дубликат, но, кроме комментария Уилла А, я не вижу ничего, имеющего отношение к контексту в этом вопросе

Дополнительная информация:

Это часть инструмента сериализации, предназначенная для поддержки циклических ссылок.В этом конкретном случае инструмент может быть переписан так, что ссылка на объект может быть взята до того, как его свойства заполнены (и ссылка необходима), как говорит Хенк Холтерман;но я хотел бы получить ответ на этот вопрос, скажем, на тот момент, когда BlackBoxObjectMaker на самом деле является черным ящиком.
Это будет тривиально в C ++, поэтому мне интересно, какие параметры доступны вC #.

Ответы [ 3 ]

4 голосов
/ 04 марта 2012

// MakeObject может вызвать GetObject для этого экземпляра MyClass

Это ваша корневая проблема.Вместо того, чтобы пытаться сделать эту работу, исправьте дизайн вашего решения здесь.

Позвольте также сказать, что MyClass может быть вызван для предоставления объекта, 'x', члены которого содержат членыэта ссылка 'x'.

Нет проблем, пока эти элементы создаются вторыми.

Короче говоря, здесь нет причин использовать рекурсию.Если вы думаете, что есть, попробуйте сделать это (намного) более понятным.

Есть ли такая вещь как «заполнитель» в C #?

Не совсем.Вы можете сделать свою собственную обертку, но это будет трудно получить и использовать ее правильно.Что-то вроде (но не совсем) WeakReference.

0 голосов
/ 11 ноября 2015

Почему вы не предоставляете статический метод MakeObject () в классе BlackBoxObjectMaker?

0 голосов
/ 04 марта 2012

В дополнение к тому, что Хенк Холтерман сказал , вы можете рассмотреть возможность использования Lazy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...