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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VS 2008 struct Bug 
:(
    Опции темы
Jlekc
Дата 21.7.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Странный баг. В VS2005 в консуль этот код выдает разные значения. И это вроде нормально
В VS2008 проект работал нормально, но на каком-то этапе начал глючить. 
Упростил код до ниже привиденного. Структура передалась по ссылки((.
Мож кто натыкался, подскажите как это лечиться.
Код

struct Test
    {
        public static void Method(Test t)
        {
            Console.WriteLine(t.GetHashCode()); ;
        }
    }

    static class Program
    {

        [STAThread]
        static void Main(string[] args)
        {
            Test t = new Test();
            Console.WriteLine(t.GetHashCode());
            Test.Method(t);
            Console.ReadLine();
        }
    }



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


Опытный
**


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

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



В продолжение глюков: 
Код

struct Test
    {
        public string Name;

        public static void Method(Test t)
        {
            Debug.WriteLine(t.GetHashCode()); ;
        }
    }

    static class Program 
    {
        
        [STAThread]
        static void Main()
        {
            Test t = new Test();
            Debug.WriteLine(t.GetHashCode()); // out: 18317060
            t.Name = "1";
            Debug.WriteLine(t.GetHashCode()); // out: -857880437

            Test.Method(t); // out: -857880437
        }
    }


почему 1 и 2 вывод отличаеться, а 3 совпадает с 2??

Это сообщение отредактировал(а) Jlekc - 21.7.2008, 13:20


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


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Не совсем понимаю - в чем проблема? Да хэш всегда одинаковый и это правильно.

Добавлено через 59 секунд
В чем проблема то - поменял значение, поменялся и хэш.
PM MAIL   Вверх
Jlekc
Дата 21.7.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хеш должен дать в данном случае адресс размешения?

Проблема в том что структура передалась по ссылке, в методе были модификации ее полей. И значит оригинальная структура тоже изменилас.
Я этого не ожидал, причем раньше все было нормально.


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


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

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



Jlekc, дело в том, что метод GetHashCode, который структура наследует у Object, возвращает Hash на основании полей. Т. к. у двух этих структур нет полей, то возвращаются одинаковые хэши.
Вот немного модифицированный пример и первого поста:
Код

  internal struct Test
  {
    public int a;
    public static void Method(Test t)
    {
      t.a = 1;
      Console.WriteLine(t.GetHashCode());
      
    }
  }
 
  public static class Program
  {
    public static void Main(string[] args)
    {
      Test t = new Test();
      t.a = 0;
      Console.WriteLine(t.GetHashCode());
      Test.Method(t);
      Console.ReadLine();
    }
  }

Здесь хэши различаются на 1. Если изменить значения параметров, хэши изменятся.

Добавлено @ 13:25
Цитата(Jlekc @  21.7.2008,  17:19 Найти цитируемый пост)
почему 1 и 2 вывод отличаеться, а 3 совпадает с 2??

Потому что в первый раз Name равен пустой строке, а во 2-й и 3-й разы - "1".

Это сообщение отредактировал(а) Idsa - 21.7.2008, 13:26


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
HalkaR
Дата 21.7.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Цитата(Jlekc @  21.7.2008,  13:22 Найти цитируемый пост)
Хеш должен дать в данном случае адресс размешения?

Хэш ни в каком случае не возвращает адрес размещения. Первое, это небезопасно, второе - бесполезно. Хэш даже в простейшем случае генерируется на основе данных в объекте.
Цитата(Jlekc @  21.7.2008,  13:22 Найти цитируемый пост)
Проблема в том что структура передалась по ссылке, в методе были модификации ее полей.

Ты ошибаешься, в данном примере структура передавалась по значению.
PM MAIL   Вверх
Jlekc
Дата 21.7.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну ладно с хешем еще понятно.
А почему такое поведение:
Код

truct Test
    {
        public int[] Data;

        public Test(int Size)
        {
            this.Data = new int[Size];
        }

        public static void Method(Test t)
        {
            t.Data[0] = 2;
        }
    }

    static class Program 
    {
        
        [STAThread]
        static void Main()
        {
            Test t = new Test(1);
            t.Data[0] = 1;
            Test.Method(t);
            Debug.WriteLine(t.Data[0]); // 2
            Console.ReadLine();
        }
    }



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


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Потому что массив - это ссылочный тип. При передаче объекта Test в метод он (объект Test) копируется, но ссылка на массив остается таже.

Это сообщение отредактировал(а) HalkaR - 21.7.2008, 13:51
PM MAIL   Вверх
Jlekc
Дата 21.7.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(HalkaR @  21.7.2008,  13:47 Найти цитируемый пост)
При передаче Test в метод он копируется, но ссылка на массив остается таже. 

Я думал что слово копируеться означает и копирование полей.
Для того чтоб не повредить оригинал заниматься ручным копирование полей? Но это криво.



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


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

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



Цитата(Jlekc @  21.7.2008,  17:56 Найти цитируемый пост)
Я думал что слово копируеться означает и копирование полей.

Так оно и есть. Просто в этом поле хранится не массив, а ссылка на него. Она и копируется.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
HalkaR
Дата 21.7.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Цитата(Jlekc @ 21.7.2008,  13:56)
Цитата(HalkaR @  21.7.2008,  13:47 Найти цитируемый пост)
При передаче Test в метод он копируется, но ссылка на массив остается таже. 

Я думал что слово копируеться означает и копирование полей.
Для того чтоб не повредить оригинал заниматься ручным копирование полей? Но это криво.

Такова жизнь smile
PM MAIL   Вверх
Jlekc
Дата 21.7.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(HalkaR @  21.7.2008,  13:58 Найти цитируемый пост)
Такова жизнь smile 

 smile 


--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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