2009-09-18 62 views
1

所以我想要一個指針指針。引用.net中的引用類型?

我已經得到了在一個更新的對象類。在另一個對象中,我想要引用原始類中對象的當前版本。這是我正在進行的一個簡化版本。

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將是一個Foo **所以,每當我們更新currentFoo的refrence到一個新的對象的助手類也可以訪問這個新對象。

是否有語法在.NET世界做到這一點?

回答

1

裏德的回答是典型的地道的C#的方式來處理這個問題,但如果你真的想要的話,您永遠可以介紹一下你自己的「參考包裝」輔助類:

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

然後同時聲明currentFoomyFooReference<Foo>,也確保currentFooreadonly,所以,沒有人可以分配不同的Reference它。

+0

對於快速和骯髒的一次性解決方案(或者如果您沒有泛型 - 即.NET 1.x),使用單元素數組也可以工作,但它不太清晰。 – 2009-09-18 19:39:04

3

沒有直接等同於這一點。

最佳選擇往往是讓你的助手類實際上保持到主類的引用,和讀/從你的主類的屬性需要寫美孚。這樣,它有一個參考持有的類美孚,而不是美孚本身。但這仍然不盡相同,因爲如果更改主要類「Foo」實例,則會失去對原始參考的引用(除非您保存了這些參考)。

+0

我可以看到這將是一個不錯的主意,但在這種情況下praticular主類是與它的東西地段一種形式,而我只需要幾個對象出來了。 訪問主窗體可能對下一個人非常危險。 – 2009-09-18 19:18:50

+0

然後使用一個接口。如果主類實現了一個接口,那麼可以使用它來公開您希望的特定屬性,並將該表單作爲接口而不是它的類傳遞。 – 2009-09-18 19:36:35

+0

這種情況下的另一個選項是定義一個只包含你需要的屬性的接口,讓表單實現它,然後在'HelperClass'中使用對所述接口的引用。這會使耦合量顯而易見並且因此變得清晰。當然,人們仍然可以將接口引用提供給原始類,但是做這些的人至少需要做出努力,並希望停下來思考他們在做什麼。 – 2009-09-18 19:37:05

0

停止思考指針

是的,你可以做你正在使用不安全的代碼在C#思考到底是什麼 - 但 嚴重,

裏德的建議是迄今爲止最好的;我有更多的上下文猜測,我們可以提出一個更好的解決方案,例如:

  • 使用屬性currentfoo
  • 時currentfoo的值設置,改變助手類的foo的屬性值

主要是我只是想強調這個問題;-)的OMG鴕鳥政策-DO是方面

+1

實際上,您不能使用不安全的方法來實現它,因爲即使不安全也不會讓您將原始指針聲明爲託管類型(對象引用是託管類型)。 – 2009-09-18 18:15:52

+0

@ [Pavel Minaev]:我站在正確的位置,謝謝 - 所有更多理由停止考慮指針! – 2009-09-18 19:18:42

0

你需要共享到具有富的屬性的類的引用。對不起,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

嗯,是的,一切更好的抽象層次更好。 我看到這與我希望我的應用程序如何工作非常接近,myFooBar持有我需要的所有上下文信息。 不幸的是,所有的東西都是在沒有中間層的情況下設置的,所以它需要更多的工作來重構應用程序才能工作,但可能是解決方案。 – 2009-09-18 19:00:26