引用.net中的引用类型?

时间:2009-09-18 17:48:05

标签: .net pointers reference

所以我想要一个指向指针的指针。

我有一个在一个对象中更新的类。在另一个对象中,我想要引用原始类中对象的当前版本。这是我正在进行的简化版本。

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

如果这是C ++,则currentFoo将是Foo *,而HelperClass的myFoo将是Foo **,因此每当我们更新currentFoo对新对象的引用时,HelperClass也将访问此新对象。

在.net世界中是否有语法来实现这一目标?

4 个答案:

答案 0 :(得分:3)

没有直接相当于此。

最好的选择通常是让HelperClass实际保留对主类的引用,并根据需要从主类的属性读/写Foo。这样,它引用了持有 Foo的类,而不是Foo本身。但是,这仍然不一样,因为如果你更改主类“Foo”实例,你将失去对原始的引用(除非你已经保存了它)。

答案 1 :(得分:1)

Reed的答案是典型的惯用C#方式来处理这个问题,但如果你真的想要它,你可以随时介绍自己的“参考包装”助手类:

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

然后将currentFoomyFoo都声明为Reference<Foo>,同时确保currentFooreadonly,这样任何人都无法指定不同的Reference {{1}}到它。

答案 2 :(得分:0)

停止思考指针

是的,您可以使用不安全的代码完成您在C#中的思考 - 但严重,

到目前为止,里德的建议是最好的;我怀疑在更多背景下我们可以提出更好的解决方案,例如:

  • 使用currentfoo的属性
  • 当设置currentfoo的值时,更改助手类的foo属性的值

主要是我只是想强调这个问题的 omg-not-do-that 方面; - )

答案 3 :(得分:0)

您需要共享对具有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()
        {}
    }