powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Задача на проф. пригодность
25 сообщений из 39, страница 1 из 2
Задача на проф. пригодность
    #39841396
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что возвратит данный код?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;
}

Console.WriteLine(new A[] { 1, 1, 1, 2, 2 }.Distinct().Count());
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841404
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

Почему?
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841427
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,
5
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841460
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5, т.к. сравнение не отработает. Сомнительная проверка на проф пригодность. Столкнулся с этим относительно недавно, раньше не знал об этом.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841489
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
     class Comp : IEqualityComparer<A>
        {
            public bool Equals(A x, A y) => x == y || !(x == null || y == null) || x.Value == y.Value;
            public int GetHashCode(A obj) => obj == null ? 0 : obj.Value;          
        }
....Distinct(new Comp()).Count();
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841515
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав, 5? а тест запускали?
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841526
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserСупер_Пав, 5? а тест запускали?
после того,как вы спросили, запустил. 5. Как я и говорил, сравнение не вызывается, т.к. переопределено не правильно
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841539
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationpation,
Почему?
Ну да правильный ответ ужо был - пуркуа что GetHashCode(). Не зря в учебниках о том пишут.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841545
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тот же решарпер в случае, когда из пары Equals/GetHashCode переопределен только один метод, подчеркивает переопределенный метод, и настойчиво рекомендует переопределить второй, что в общем-то правильно, хотя в данном случае не вполне очевидно - Distinct использует внутренний класс Set<T>, который для обнаружения аналогичного элемента активно использует поиск во внутренних структурах на основании хэшкода. Если нашлось - дальше вызывает IEqualityComparer<TSource> (если не задан, то дефолтный), если не нашлось - Equals объекта вообще не будет вызван, считается, что он уже уникален.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841568
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вернёт данный код?
Код: javascript
1.
[1, 2, 3, 4, 5].map(parseInt)


Почему?
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841572
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,
[1, 2, 3, 4, 5].map(x=>parseInt(x,4))
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841647
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныEquals объекта вообще не будет вызван, считается, что он уже уникален.

ох, не конечно, equals всегда будет вызван
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841710
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСон Веры ПавловныEquals объекта вообще не будет вызван, считается, что он уже уникален.

ох, не конечно, equals всегда будет вызван
Это легко проверяется установкой брейкпоинта в теле Equals.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841729
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(Enumerable.Range(0,5).Select(n=>new Foo()).Distinct().Count());
  }
}
class Foo
{
  public override bool Equals(object obj)=>throw new NotImplementedException();
}


Код: plaintext
5
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841755
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В случае Distinct, без переданного компарера, будет вызван
Код: c#
1.
class ObjectEqualityComparer<T>.Equals(object, object)


Который сравнит ссылки.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841757
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВ случае Distinct, без переданного компарера, будет вызван
Код: c#
1.
class ObjectEqualityComparer<T>.Equals(object, object)


Который сравнит ссылки.
Он не сравнит ссылки, он вызовет obj1.Equals(obj2): https://referencesource.microsoft.com/#mscorlib/system/collections/generic/equalitycomparer.cs,250 (сравение ссылок - это ReferenceEquals).
Если Equals переопределен, то, разумеется, вызовется переопределенный метод. Но до этого не доходит.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841758
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если так
Код: c#
1.
struct A.....


То результат 2.
Ешо одын отличий клас от структур!
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841761
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВКстати, если так
Код: c#
1.
struct A.....


То результат 2.
Ешо одын отличий клас от структур!
Ну, у структур хэшкод вычисляется совсем не так, как у классов, это вроде бы известный факт. Особенно если у структуры нет ссылочных полей.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841814
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВКстати, если так
Код: c#
1.
struct A.....



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

Нет, то же будет 5
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841815
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныТот же решарпер в случае, когда из пары Equals/GetHashCode переопределен только один метод, подчеркивает переопределенный метод, и настойчиво рекомендует переопределить второй, что в общем-то правильно, хотя в данном случае не вполне очевидно - Distinct использует внутренний класс Set<T>, который для обнаружения аналогичного элемента активно использует поиск во внутренних структурах на основании хэшкода. Если нашлось - дальше вызывает IEqualityComparer<TSource> (если не задан, то дефолтный), если не нашлось - Equals объекта вообще не будет вызван, считается, что он уже уникален.

Решарпер для GetHashCode формирует очень сомнительный код, который в большинстве случаев работает неправильно
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841823
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationРешарпер для GetHashCode формирует очень сомнительный код, который в большинстве случаев работает неправильно
Ээмм.. ну да, обычно он его формирует как
Код: c#
1.
2.
3.
4.
public override int GetHashCode()
{
  return base.GetHashCode();
}


Я всегда считал, что это просто болванка, в которую нужно вписывать свой код.
...
Рейтинг: 0 / 0
Задача на проф. пригодность
    #39841827
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

вообще-то я говорил о том, что он предлагает что вроде такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
сlass A
{
   public int Id {get;set;}
   public string Name {get;set;}
   public DateTime Date {get;set;}

   public override int GetHashCode()
   {
       unchecked
                {
                    var hashCode = Id.GetHashCode();
                    hashCode = (hashCode * 397) ^ Name.GetHashCode();
                    hashCode = (hashCode * 397) ^ Date.GetHashCode();
                    return hashCode;
                }
   }

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

вообще-то я говорил о том, что он предлагает что вроде такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
сlass A
{
   public int Id {get;set;}
   public string Name {get;set;}
   public DateTime Date {get;set;}

   public override int GetHashCode()
   {
       unchecked
                {
                    var hashCode = Id.GetHashCode();
                    hashCode = (hashCode * 397) ^ Name.GetHashCode();
                    hashCode = (hashCode * 397) ^ Date.GetHashCode();
                    return hashCode;
                }
   }

}


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

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

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


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