是否在.net中引用引用引用类型?
所以我想要一个指向指针的指针 我有一个在一个对象中更新的类。在另一个对象中,我希望引用原始类中对象的当前版本。这里有一个简单的版本,我正在进行是否在.net中引用引用引用类型?,.net,pointers,reference,.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
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++,CurrutFoo将是一个Foo*,HelperClass的MyFo会是一个Foo*,这样每当我们更新CurrutFoo的一个新对象的对象时,HelPrError也将访问这个新的对象。
在.net世界中,是否有语法可以实现这一点?没有与之直接等价的语法
最好的选择通常是让HelperClass实际保留对主类的引用,并根据需要从主类上的属性读取/写入Foo。这样,它就引用了持有Foo的类,而不是Foo本身。但是,这仍然是不一样的,因为如果您更改主类“Foo”实例,您将丢失对原始类的引用(除非您也保存了该引用)。没有与此直接等效的方法 最好的选择通常是让HelperClass实际保留对主类的引用,并根据需要从主类上的属性读取/写入Foo。这样,它就引用了持有Foo的类,而不是Foo本身。不过,这还是不一样的,因为如果更改主类“Foo”实例,将丢失对原始类的引用(除非也保存了该引用)。不要再考虑指针了 是的,你可以使用不安全的代码完全按照你在C#中的想法去做——但说真的,不要这样做 里德的建议是迄今为止最好的;我怀疑,在更多的背景下,我们可以提出更好的解决方案,例如:
- 使用currentfoo的属性
- 设置currentfoo的值时,更改helper类的foo属性的值
- 使用currentfoo的属性
- 设置currentfoo的值时,更改helper类的foo属性的值
我主要是想强调这个问题中的“天哪,不要做”这一方面;-) Reed的答案是处理这个问题的典型惯用C#方法,但如果您真的需要,您可以随时引入自己的“引用包装器”帮助器类:
public class Reference<T> where T : class
{
public T Value { get; set; }
}
公共类引用,其中T:class
{
公共T值{get;set;}
}
然后将
currentFoo
和myFoo
声明为Reference
,并确保currentFoo
为readonly
,以便任何人都不能为其分配不同的Reference
Reed的答案是处理这个问题的典型惯用C#方法,但如果您真的需要,您可以随时引入自己的“引用包装器”帮助器类:
public class Reference<T> where T : class
{
public T Value { get; set; }
}
公共类引用,其中T:class
{
公共T值{get;set;}
}
然后将
currentFoo
和myFoo
声明为Reference
,并确保currentFoo
为readonly
,以便任何人都不能为其分配不同的Reference
您需要共享对以Foo作为属性的类的引用。很抱歉用C#-)写
您需要共享对以Foo作为属性的类的引用。很抱歉用C#-)写
实际上,你不能使用不安全的,因为即使是不安全的也不允许你声明托管类型的原始指针(对象引用是托管类型)。@[Pavel Minaev]:我已经纠正了,谢谢-这就是停止思考指针的原因!实际上,你不能使用不安全的,因为即使是不安全的也不允许你声明托管类型的原始指针(对象引用是托管类型)。@[Pavel Minaev]:我已经纠正了,谢谢-这就是停止思考指针的原因!啊,是的,每件事都在一个抽象的层次上运行得更好。我看到这与我希望我的应用程序的工作方式非常接近,myFooBar保存了我需要的所有上下文信息。不幸的是,所有的东西都是在没有中间层的情况下设置的,因此需要做更多的工作来重新构建应用程序,使其能够像这样工作,但很可能就是解决方案。啊,是的,每件事都在一个更高的抽象级别上工作得更好。我看到这与我希望我的应用程序的工作方式非常接近,myFooBar保存了我需要的所有上下文信息。不幸的是,所有的东西都是在没有中间层的情况下设置的,所以需要做更多的工作来重新构建应用程序,使其能够像这样工作,但可能是解决方案。我知道这是一个好主意,但在这种情况下,主类是一个包含很多内容的表单,我只需要几个对象。对下一个家伙来说,访问主窗体可能非常危险。那么就使用一个接口吧。如果主类实现了一个接口,您可以使用它来公开所需的特定属性,并将表单作为接口而不是类传入。该场景中的另一个选项是定义一个仅包含表单所需属性的接口,让表单实现它,并在
HelperClass
中引用所述接口。这将使耦合量变得明确,从而变得清晰。当然,我们仍然可以将接口引用转换为原始类,但这样做的人至少需要付出努力,并希望停下来思考他们正在做什么。这种接口想法非常酷,我可能最终会使用它,或者类似的东西。我会巧妙地把一些东西藏在我的心理工具箱里。我看得出来