Ссылки на объекты и проблема переназначения в .net - PullRequest
2 голосов
/ 17 ноября 2010

Может быть, это вопрос, но я привык к указателям и ссылкам на c ++, и это меня немного смущает. Допустим, у меня есть следующий сценарий в приложении VB.net:

Dim x As New Dictionary(Of String, MyType)
'I add stuff to x
Dim y As MyObject= x("foo1")
'later...
y = New MyType()
'now y and x("foo1") don't point to the same instance anymore

Ситуация такова: у меня есть коллекция объектов, и во время выполнения программы любой из них может быть извлечен из коллекции для использования / редактирования другой частью программы. Теперь, очевидно, если я отредактирую данные внутри объекта, то все в порядке, но что если я захочу заменить объект, как я это делал выше в строке 5? Я бы изменил только локальную ссылку (y), но не объект внутри коллекции! Это можно обойти? Как я могу взять с собой «ссылку на ссылку на объект», а не просто ссылку, поэтому, если я переназначу ее, она также переназначит одну из коллекции? Надеюсь, я проясняю, к сожалению, английский не является моим родным языком, чтобы быть ясным: в c ++ это было бы легко, используя указатель на указатель или передавая указатель на объект всегда по ссылке, вызывая new или переназначение на нем изменился бы сам исходный указатель)

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 17 ноября 2010

Вы не можете использовать указатели в VB.NET (или C #, кроме как через небезопасный код).

Вместо этого, чтобы изменить исходное значение в словаре, который вы присвоили y, вам нужно снова получить к нему доступ через сам объект словаря , а не через удаленную ссылку:

x("foo1") = New MyType()

Причина в том, что значение в указанном месте в словаре ("foo1") присваивается y, а не является ссылкой на само местоположение в словаре. Я не совсем уверен, почему вы используете класс DataObject, но y будет содержать значение типа MyType, когда оно назначено в вашем коде. Присвоение нового значения y только изменит значение y, а не исходное значение в словаре. Он не знает об этой ценности. По сути, думайте об этом, как будто вы извлекаете копию значения из словаря и помещаете ее в переменную y. Нет возможности скопировать ссылку на страницу в словаре.

2 голосов
/ 17 ноября 2010

Если вам действительно нужна вещь «указатель на указатель» (потому что у вас нет доступа к словарю), вам нужно добавить уровень косвенности для ваших записей:

Class PointerToMyType
    Public Value As MyType
End Class

Dim x As New Dictionary(Of String, PointerToMyType)  

'' add value
x("foo1") = New PointerToMyType() With {.Value = New MyType()}

Dim y As PointerToMyType = x("foo1")  
'' use y.Value

'' later...  
y.Value = New MyType()

'' now y and x("foo1") still point to the same instance
2 голосов
/ 17 ноября 2010

Вы бы сделали это в самом словаре:

C #:

 x["foo1"] = new MyType();
 y = x["foo1"];

VB:

 x("foo1") = New MyType()
 y = x("foo1")
1 голос
/ 17 ноября 2010

Я не совсем уверен, получил ли я именно то, чего вы пытаетесь достичь, но если я правильно понимаю, вы хотите, чтобы новый объект y также был указан в коллекции X.

Если этослучае, то это должно сделать это

Dim y As DataObject = x("foo1")
'later...
.....
y = New MyType()
//Reassign the new y object to the x collection
x("foo1") = y
.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...