2011-02-23 58 views
1

這個小代碼片段將使用我的引用對象作爲關鍵字來增加存儲在字典中的計數值(整數)。當字典很小時,多次查找並不是什麼大問題,但是這個特殊的字典會變得很大。使用指向字典值中的值類型的指針

Private RefCount As IDictionary(Of ILifeTimeManaged, Integer) 
......... CODE HERE..... 

Private Sub IncrementRefCount(ByVal entity As ILifeTimeManaged) 

    Dim prevCount As Integer 

    ''# if we have no reference entry, add one and set its count to 1 

    If Not RefCount.TryGetValue(entity, prevCount) Then 
     RefCount.Add(entity, 1) 
    Else 
     ''# otherwise increment its count by 1 

     RefCount.Item(entity) = prevCount + 1 
    End If 

End Sub 

我找到了相應的字典條目,然後遞增存儲在該值中的int值,或者添加一個新的字典條目。

使用指向字典值的指針是不是一個好主意?然後當我已經獲得價值時,我可以避免第二次鍵查找。你將如何實現它?這在.NET4中甚至可能嗎?

我可以用IntPtr來做嗎? http://msdn.microsoft.com/en-us/library/system.intptr.aspx

RefCount.Item(entity) = prevCount + 1 

回答

1

你不能像在C++中那樣在VB中創建任何給定類型的指針。但是,您可以在引用類型中包裝值類型以獲取所需的語義。

Public Class Ref(Of T As Structure) 

    Public Sub New() 
    End Sub 
    Public Sub New(ByVal value As T) 
     Me.Value = value 
    End Sub 

    Public Property Value As T 

End Class 

這使您可以返回一個「指針」到一個整數(更準確地說,對包含整數的東西的引用)。然後,你可以寫這樣的事情:

Private RefCount As IDictionary(Of ILifeTimeManaged, Ref(Of Integer)) 
......... CODE HERE..... 

Private Sub IncrementRefCount(ByVal entity As ILifeTimeManaged) 
    Dim count As Integer 

    ''# if we have no reference entry, add one and set its count to 1 
    If Not RefCount.TryGetValue(entity, count) Then 
     RefCount.Add(entity, New Ref(Of Integer)(1)) 
    Else 
     ''# otherwise increment its count by 1 
     count.Value += 1 
    End If 
End Sub 

你可以TRef(Of T)之間添加一些轉換方法的Ref類可能簡化的語法(如在添加通話)。在我看來,這樣做會比C++指針更接近C++引用。無論這是你想要的還是不是由你決定。

編輯RE您的編輯: IntPtr旨在表示互操作代碼調用中的任何指針類型。也許更好的名字應該是NativePtr。無法像我想的那樣在託管代碼中使用IntPtr,就像在C++中使用指針一樣。

+0

沒錯,但在這裏,我稱量拆箱成本與我的字典查找的成本。 – Matthew 2011-02-24 00:00:34

+0

澄清:如果我使用引用對象來保存容器,我正在討論容器的「拆箱」以派生我的int。 – Matthew 2011-02-24 00:26:57

+0

@Matthew PK:你有Ref的「拆箱」與Dictionary的「拆箱」和查找,所以它應該是Ref的一個勝利,但這絕對是一個微型優化。 – 2011-02-24 01:27:00

2

這看起來不是一個壞主意。

如果要提高性能,可能需要將屬性RefCount添加到ILifeTimeManaged接口並使用它來代替使用字典。但我不知道你的設計和目標,所以不能說這是適合你的。

+0

ILifeTimeManaged不能存儲引用計數。 ILikeTimeManaged對象由LifeTimeManager進行管理,該基本上跟蹤有多少實例處於未完成狀態並處理它們的創建或銷燬。 – Matthew 2011-02-23 23:25:00

+0

好的。順便說一句,你意識到在.NET中你實際上並不需要數引用,因爲GC做了所有的內存管理工作? – 2011-02-23 23:53:50

+0

不在我的情況。經理處理所有對象的處置,並決定是否重新發布它們。 ) – Matthew 2011-02-23 23:59:28