использование указателя на тип значения в значении словаря - PullRequest
1 голос
/ 24 февраля 2011

Этот небольшой фрагмент кода предназначен для увеличения значения счетчика (целого числа), которое хранится в словаре, используя мой объект, на который ссылаются, в качестве ключа. Когда словарь маленький, многократные поиски не имеют большого значения, но этот конкретный словарь может стать довольно большим.

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

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Это не похоже на плохую идею.

Если вы хотите повысить производительность, вы можете добавить свойство RefCount в интерфейс ILifeTimeManaged и использовать его вместо словаря. Но я не знаю твоего замысла и цели, поэтому не могу сказать, подходит ли тебе это.

1 голос
/ 24 февраля 2011

Вы не можете сделать указатель на любой данный тип в VB, как в C ++.Однако вы можете обернуть тип значения в ссылочный тип, чтобы получить необходимую семантику.

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

Вы можете добавить некоторые методы преобразования между T и Ref(Of T) в класс Ref, чтобы возможно упростить синтаксис (как в вызове Add).По моему мнению, это даст вам нечто большее, чем ссылки на C ++, чем указатели на C ++.Независимо от того, хотите вы этого или нет, решать только вам.

Edit RE, ваш Edit: IntPtr предназначен для представления любого типа указателя в вызовах кода взаимодействия.Возможно, лучшим именем было бы NativePtr.Нет никакого способа использовать IntPtr в управляемом коде так, как я думаю, вы хотите, как вы указали бы в C ++.

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