Ссылка на тип ссылки в .net? - PullRequest
1 голос
/ 18 сентября 2009

Итак, я хочу указатель на указатель.

У меня есть класс, который обновляется в одном объекте. В другом объекте я хочу ссылку на текущую версию объекта в исходном классе. Вот своего рода упрощенная версия того, что у меня происходит.

Public Class Foo
    'conaints information

End Class

Public Class myMainApp
    Dim myHelper As HelperClass
    Dim currentFoo As Foo

    Private Sub init()
        currentFoo = New Foo()
        myHelper = New HelperClass(currentFoo)
    End Sub

    Private Sub UpdatingUI()
        currentFoo = GetFooFromContext()
    End Sub

    Private Function GetFooFromContext() As Foo
        Return New Foo()
    End Function
End Class


Public Class HelperClass
    Private myFoo As Foo

    Public Sub New(ByVal aFoo As Foo)
        myFoo = aFoo
    End Sub
End Class

если thise был C ++, currentFoo был бы Foo *, а myFoo HelperClass был бы Foo **, так что всякий раз, когда мы обновляли ссылку currentFoo на новый объект, HelperClass также обращался к этому новому объекту.

Есть ли синтаксис для достижения этой цели в мире .net?

Ответы [ 4 ]

3 голосов
/ 18 сентября 2009

Прямого эквивалента этому нет.

Лучшим вариантом, как правило, является сохранение в HelperClass ссылки на ваш основной класс и чтение / запись Foo по мере необходимости из свойства вашего основного класса. Таким образом, он имеет ссылку на класс, который содержит Foo вместо самого Foo. Однако это не то же самое, поскольку, если вы измените экземпляр "Foo" основных классов, вы потеряете ссылку на оригинал (если только вы не сохранили его).

1 голос
/ 18 сентября 2009

Ответ Рида является типичным идиоматическим способом C # для решения этой проблемы, но если вы действительно этого хотите, вы всегда можете просто ввести свой собственный вспомогательный класс "reference wrapper":

public class Reference<T> where T : class
{
    public T Value { get; set; }
}

Затем объявите currentFoo и myFoo как Reference<Foo>, а также убедитесь, что currentFoo равно readonly, чтобы никто не мог назначить ему другой Reference.

0 голосов
/ 18 сентября 2009

Вам необходимо предоставить ссылку на класс, который имеет свойство Foo. Извините, что пишу на C #; -)

class MyMainApp
    {
        private HelperClass myHelper;
        private FooBar myFooBar;

        public void Init()
        {
            myFooBar=new FooBar(new Foo());
            myHelper=new HelperClass(myFooBar);
        }

        public void UpdateFromUI()
        {
            myFooBar.CurrentFoo = GetFooFromContext();
            myHelper.DoSomethingWithTheFoo();
        }

        private Foo GetFooFromContext()
        {
            return new Foo();
        }
    }

    class FooBar
    {
        public Foo CurrentFoo;

        public FooBar(Foo new_foo)
        {
            CurrentFoo = new_foo;
        }
    }

    class HelperClass
    {
        private FooBar myFooBar;

        public HelperClass(FooBar new_foobar)
        {
            myFooBar = new_foobar;

        }

        public void DoSomethingWithTheFoo()
        {
            myFooBar.CurrentFoo.JumpThroughHoop();
        }
    }

    class Foo
    {
        public void JumpThroughHoop()
        {}
    }
0 голосов
/ 18 сентября 2009

Хватит думать о указателях

да, вы можете делать именно то, что думаете в C #, используя небезопасный код - но серьезно, не .

Совет Рида пока лучший; я подозреваю, что с большим контекстом мы могли бы предложить лучшее решение, например:

  • использовать свойство для currentfoo
  • когда установлено значение currentfoo, измените значение свойства foo вспомогательного класса

В основном я просто хотел подчеркнуть аспект omg-not-do-that этого вопроса; -)

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