powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Задача на проф. пригодность
14 сообщений из 39, страница 2 из 2
Задача на проф. пригодность
    #39841888
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationЕвгенийВКстати, если так
Код: c#
1.
struct A.....



То результат 2.
Ешо одын отличий клас от структур!

Нет, то же будет 5
А ты спытай!
Структура унаследована от ValueType, у последнего переопределены оба метода, они и будут вызваны.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841943
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

базовые методы у стукрутуры GetHashCode и Equals ппц какие тормозные, по этому их лучше сразу переопределить, если будите их использовать в большом количестве.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841953
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Если нет полей, ссылочных типов, то довольно шустро.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841971
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что будет тут? И почему.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
   static void Main(string[] args)
        {
            var data = new S1[] { 123, 123L, 456L, 123 };

            var cnt = data.Distinct().Count();
            Console.ReadLine();
        }

        [StructLayout(LayoutKind.Sequential, Size = 1024)]
        struct S1
        {
            public static unsafe implicit operator S1(int i)
            {
                S1 res = new S1();
                var arr = BitConverter.GetBytes(i);
                var x = GCHandle.Alloc(res, GCHandleType.Pinned);
                Marshal.Copy(arr, 0, x.AddrOfPinnedObject(), arr.Length);
                x.Free();
                return res;
            }
            public static unsafe implicit operator S1(long i)
            {
                S1 res = new S1();
                var arr = BitConverter.GetBytes(i);
                var x = GCHandle.Alloc(res, GCHandleType.Pinned);
                Marshal.Copy(arr, 0, x.AddrOfPinnedObject(), arr.Length);
                x.Free();
                return res;
            }
        }
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841979
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВpationпропущено...


Нет, то же будет 5
А ты спытай!
Структура унаследована от ValueType, у последнего переопределены оба метода, они и будут вызваны.
сорь, неподумавши ляпнул
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841994
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVosttпропущено...


Да, хеш будет вычислен от ссылки.
Но опять таки, by design.
А вот фик там :)
Ссылка может поменяться после сборки мусора, но у одного и того объекта, на протяжении жизни хеш должен быть постоянным.
Видимо ради экономии места, для вычисления хеша, используется тоже самое поле, что и для lock.
Вот тут товарищ пишет (прилагая пруфлинки) что для ссылочных типов используется некий уникальный для каждого потока генератор хешей. Ну, и сохраняет его в SyncBlock'е.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841997
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,
Так правильно.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
   [StructLayout(LayoutKind.Sequential, Size = 1024)]
        struct S1
        {
            public static unsafe implicit operator S1(int i)
            {
                S1[] res = new S1[1];
                var arr = BitConverter.GetBytes(i);
                var x = GCHandle.Alloc(res, GCHandleType.Pinned);
                var adr = x.AddrOfPinnedObject();
                Marshal.Copy(arr, 0, adr, arr.Length);
                x.Free();
                return res[0];
            }
            public static unsafe implicit operator S1(long i)
            {
                S1[] res = new S1[1]; ;
                var arr = BitConverter.GetBytes(i);
                var x = GCHandle.Alloc(res, GCHandleType.Pinned);
                var adr = x.AddrOfPinnedObject();
                Marshal.Copy(arr, 0, adr, arr.Length);
                x.Free();
                return res[0];
            }
     
        }
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39842020
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я помню из книги Рихтера, еще за 2007 год, для того чтобы метод Equals заработал, надо обязательно переопределить метод GetHashCode. Всегда парами их надо переопределять.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// Вот так вернет 2
class A
{
    public int Value { get; set; }

    public static implicit operator A(int x) => new A { Value = x };

    public override bool Equals(object obj) => obj is A a && a.Value == Value;
            
    public override int GetHashCode() => Value.GetHashCode();
}
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39842024
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Захотел проверить, но что-то даже не компилируется

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
using System;
using System.Linq;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {


            Console.WriteLine(new A[] { 1, 1, 1, 2, 2 }.Distinct().Count());
            Console.ReadLine();

          
        }
    }
    class A
    {
        public int Value { get; set; }

        public static implicit operator A(int x) => new A { Value = x };

        public override bool Equals(object obj) => obj is A a && a.Value == Value;
    }

}
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39842025
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

Visual Studio когда последний раз обновлял?

Тынц
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39842045
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

Вот так будет то же самое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
[StructLayout(LayoutKind.Sequential, Size = 1024)]
struct S1
{
  static Random Rnd = new Random((int)DateTime.Now.Ticks);
  public static implicit operator S1(int i)
  {
    S1[] res = new S1[1];
    var arr = new byte[BitConverter.GetBytes(i).Length];
    Rnd.NextBytes(arr);
    var x = GCHandle.Alloc(res, GCHandleType.Pinned);
    var adr = x.AddrOfPinnedObject();
    Marshal.Copy(arr, 0, adr, arr.Length);
    x.Free();
    return res[0];
  }
  public static implicit operator S1(long i)
  {
    S1[] res = new S1[1]; ;
    var arr = new byte[BitConverter.GetBytes(i).Length];
    Rnd.NextBytes(arr);
    var x = GCHandle.Alloc(res, GCHandleType.Pinned);
    var adr = x.AddrOfPinnedObject();
    Marshal.Copy(arr, 0, adr, arr.Length);
    x.Free();
    return res[0];
  }
}


Cat2Захотел проверить, но что-то даже не компилируется
Всегда следует исходить из того, что публикуемый код написан на последней существующей (даже не поддерживаемой) версии языка.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39842052
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныВот так будет то же самое:
А вот так - совсем не то же самое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
[StructLayout(LayoutKind.Sequential, Size = 1024)]
struct S1
{
  long Value;
  static Random Rnd = new Random((int)DateTime.Now.Ticks);
  public static implicit operator S1(int i)
  {
    S1[] res = new S1[1];
    var arr = new byte[BitConverter.GetBytes(i).Length];
    Rnd.NextBytes(arr);
    var x = GCHandle.Alloc(res, GCHandleType.Pinned);
    var adr = x.AddrOfPinnedObject();
    Marshal.Copy(arr, 0, adr, arr.Length);
    x.Free();
    return res[0];
  }
  public static implicit operator S1(long i)
  {
    S1[] res = new S1[1]; ;
    var arr = new byte[BitConverter.GetBytes(i).Length];
    Rnd.NextBytes(arr);
    var x = GCHandle.Alloc(res, GCHandleType.Pinned);
    var adr = x.AddrOfPinnedObject();
    Marshal.Copy(arr, 0, adr, arr.Length);
    x.Free();
    return res[0];
  }
}


и так тоже:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
[StructLayout(LayoutKind.Sequential, Size = 1024)]
struct S1
{
  long Value;
  static Random Rnd = new Random((int)DateTime.Now.Ticks);
  public static implicit operator S1(int i)
  {
    S1[] res = new S1[1];
    var arr = BitConverter.GetBytes(i);
    var x = GCHandle.Alloc(res, GCHandleType.Pinned);
    var adr = x.AddrOfPinnedObject();
    Marshal.Copy(arr, 0, adr, arr.Length);
    x.Free();
    return res[0];
  }
  public static implicit operator S1(long i)
  {
    S1[] res = new S1[1]; ;
    var arr = BitConverter.GetBytes(i);
    var x = GCHandle.Alloc(res, GCHandleType.Pinned);
    var adr = x.AddrOfPinnedObject();
    Marshal.Copy(arr, 0, adr, arr.Length);
    x.Free();
    return res[0];
  }
}


Т.о. если полей нет, то вычислитель хэшкода на содержимое занимаемой памяти не смотрит.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39842099
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВидимо ради экономии места, для вычисления хеша, используется тоже самое поле, что и для lock.

Да хеш будет лежать вместо индекса контекста синхронизации :)
Я ж не имел в виду от значения ссылки
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39842393
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныТ.о. если полей нет, то вычислитель хэшкода на содержимое занимаемой памяти не смотрит.
Судя по исходникам ValueType и coreclr , получается такая картина:
1. Эта структура, как ни странно, не может использовать быстрые варианты вычисления хэшкода и эквивалентности: если вытащить рефлекшеном значение метода CanCompareBits , то он вернет false. Видимо, структура является неплотно упакованной, потому как другие причины такого значения (переопределенные GetHashCode и/или Equals, наличие полей ссылочного типа - полей нет вообще никаких) отпадают (вот нативный код реализации CanCompareBits ).
2. Из-за п.1 мы получаем сравнение в цикле полей, и вычисление хэшкода на основе полей. Но т.к. полей нет, то в цикл мы не входим, и из метода Equals выходим с значением true . И т.к. полей нет, то вычислитель хэшкода возвращает значение, установленное до цикла вычисления хэшкода - некий TypeId, полученный от MethodTable типа, и обработанный вот таким образом :
Код: c#
1.
hashCode = typeID * 711650207 + 2506965631U;

- т.е. всегда одинаковый для всех экземпляров структуры.
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Задача на проф. пригодность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]