Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как распечатать "адрес" переменной? 
:(
    Опции темы
Dims
Дата 1.8.2010, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



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

Работать должно и если GetHashCode переопределён.

Это аналог вот этого вопроса: http://forum.vingrad.ru/index.php?showtopi...t&p=1319128
Но для Сишарп.


PM MAIL   Вверх
nmn
Дата 1.8.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: 1
Всего: 1



на C# вроде так сделать нельзя, можно использовать MC++

вот что у меня получилось, правильность не гарантирую, потому что никогда ранее на mc++ не писал

Код

System::String *s=S"123";
    void* __pin *p=(void**)&s;
    IntPtr ptr=(IntPtr)*p;
    s=ptr.ToString();
    Console::WriteLine(s);



PM Skype   Вверх
Fortnox
Дата 1.8.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



Ммм, если я вас правильно понял - для типа object, то можно сделать так:
Код

            object one = 5;
            object two = 6;

            GCHandle handle1 = GCHandle.Alloc(one, GCHandleType.Pinned);
            GCHandle handle2 = GCHandle.Alloc(two, GCHandleType.Pinned);

            IntPtr addr1 = handle1.AddrOfPinnedObject(); // адрес one
            IntPtr addr2 = handle2.AddrOfPinnedObject(); // aдрес two

            Console.WriteLine("Address is {0}", addr1.ToString("x"));
            Console.WriteLine("Address is {0}", addr2.ToString("x"));

            if (one == two)
                Console.WriteLine("true");
            else
                Console.WriteLine("false");


Вывод:
Код

Address is 13694d0
Address is 13694dc
false

PM MAIL   Вверх
Dims
Дата 2.8.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



А это будет то же самое число, которое возвращает GetHashCode?
PM MAIL   Вверх
nmn
Дата 2.8.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: 1
Всего: 1



Цитата(Dims @ 2.8.2010,  21:58)
А это будет то же самое число, которое возвращает GetHashCode?

в данном случае нет
т.к. int.GetHashCode() возвращает значение переменной

хехе, попробовал object one=new object();

и на Alloc получил исключение 
Код

Объект содержит данные, которые не являются примитивами или требуют преобразования.


Это сообщение отредактировал(а) nmn - 2.8.2010, 22:36
PM Skype   Вверх
Fortnox
Дата 5.8.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



nmn, object не является простым типом, поэтому нельзя выделить для него дескриптор при помощи GCHandle.Alloc.

В своем сообщении выше забыл освободить дескрипторы handle1 и handle2, так как они защищены от сборщика.
Код

handle1.Free();
handle2.Free();

PM MAIL   Вверх
nmn
Дата 5.8.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: 1
Всего: 1



Цитата(Fortnox @  5.8.2010,  18:47 Найти цитируемый пост)
object не является простым типом, поэтому нельзя выделить для него дескриптор при помощи GCHandle.Alloc.

ну так ведь для объектов надо
PM Skype   Вверх
mrbrooks
Дата 6.8.2010, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



если объект свой, то в нем надо переопределить методы Equals() и GetHashCode().

up
хотя если нужно сравнивать адреса, есть смысл использовать небезопасный код. 
хотя и метод Fortnox хорош.

Это сообщение отредактировал(а) mrbrooks - 6.8.2010, 08:36
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.