2009-09-03 4 views
1

Кто-нибудь знает, имеет ли C# эквивалент ObjPtr от VB6 или эквивалентную функциональность (подробнее см. Ниже)? Вот несколько ссылок на информацию об ObjPtr devx, thevbzone.Эквивалент (функциональность) ObjPtr от VB6 в C#?

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

Любые мысли или предложения?

FK

+0

Из вашего описания я не понимаю, почему вы использовали 'ObjPtr'. Это реальная хакерская вещь на низком уровне, и это звучит так, как будто в вашем случае достаточно простого тестирования равенства объектов с помощью 'Is'. Не могли бы вы уточнить? –

+0

Ну, ObjPtr, возможно, не был лучшим выбором, но я взял большую базу кода и использовал ее вне кода ... и это сработало. В этом случае снова снова является старой базой кода ... «IS» может работать, если я обновляю код больше, прямо сейчас начальная прогулка по древовидной структуре сохраняет только имя в массиве, чтобы ссылаться на него, поэтому я не У меня есть объект для сравнения. –

+0

Почему бы не сохранить ссылку на объект? Нет недостатков по сравнению с сохранением имени. Так же быстро и использует тот же объем памяти. – MarkJ

ответ

-2

GetHashCode должен хорошо работать для тестирования уникальных значений, если третья сторона не перекрываться реализация объекта с чем-то, что не имеет смысла в вашем сценарии.

Я бы предположил, что узлы в дереве будут определять равенство/hashcode не только как строку значений, но вам нужно будет проверить.

+0

-1. «По умолчанию реализация метода GetHashCode делает ** не ** гарантией уникальных возвращаемых значений для разных объектов.«Он предназначен для * хеширования * не для предоставления уникальных идентификаторов. Из MSDN здесь: http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx – MarkJ

+0

-1 Hashcode не предназначен и для это и никогда не должно использоваться таким образом. –

1

Если у treenode есть свойство FullPath, вы можете использовать его для однозначной идентификации узла в дереве (Winforms Treeview имеет свойство FullPath). Это не будет уникальным, если у двух братьев и сестер одинаковый текст.

ИЛИ

Вы можете использовать Handle свойство TreeNode.

+0

Вопрос действительно говорит, что это стороннее древовидное представление, поэтому он может не иметь стандартных свойств. – MarkJ

+0

@Mark: И именно поэтому я начинаю с «если у treenode есть ... ":) – shahkalpesh

1

Ближайший прямой эквивалент, который я могу придумать, - использовать GCHandle для получения IntPtr для ссылки на объект.

Вам нужно будет выделить GCHandle для вашего объекта (GCHandle.Alloc), а затем использовать GCHandle.ToIntPtr для преобразования в IntPtr. Связанная документация показывает процесс.

+0

Я думаю, что вы правы - это самый близкий эквивалент ObjPtr - но я не думаю, что FKCoder должен использовать эту атомную бомбу, чтобы взломать свой орех. – MarkJ

+0

Я согласен - но я пытался ответить на вопрос напрямую , в любом случае. –

2

Если это объекты, почему бы просто не сохранить ссылки на объекты напрямую? Они будут уникальными.

Вы можете использовать Object.ReferenceEquals(x, y), чтобы определить, ссылается ли ссылка на тот же объект, который вы только что извлекли из дерева.

Смежные вопросы