Сравнение структур на равенство без упаковкиC#

Место общения программистов C#
Anonymous
Сравнение структур на равенство без упаковки

Сообщение Anonymous »

Я столкнулся с методом расширения, который применяется к структурам (SomeStruct) и возвращает, равно ли значение значению по умолчанию (SomeStruct) (когда вызывается конструктор без параметров). р>

Код: Выделить всё

public static bool IsDefault (this T value)
where T : struct
{
return (EqualityComparer.Default.Equals(value, default(T)));
}
Это заставило меня задуматься, была ли структура упакована. Это чисто из любопытства, так как у упаковки/передачи по значению есть плюсы и минусы в зависимости от контекста.
Предположения:
  • Первый из следующих методов недопустим, поскольку структуры не переопределяют неявно операторы равенства ==/!=.
  • Второй «появляется», чтобы избежать упаковки .
  • Третий метод всегда должен упаковывать структуру, поскольку он вызывает object.Equals(object o).
  • Четвертый имеет оба доступны перегрузки (object/T), поэтому я предполагаю, что он также будет избегать бокса. Однако целевая структура должна будет реализовать интерфейс IEquatable, что делает вспомогательный метод расширения не очень полезным.
Вариации:

Код: Выделить всё

public static bool IsDefault (this T value)
where T : struct
{
// Illegal since there is no way to know whether T implements the ==/!= operators.
return (value == default(T));
}

public static bool IsDefault (this T value)
where T : struct
{
return (EqualityComparer.Default.Equals(value, default(T)));
}

public static bool IsDefault (this T value)
where T : struct
{
return (value.Equals(default(T)));
}

public static bool IsDefault (this T value)
where T : struct, IEquatable
{
return (value.Equals(default(T)));
}
Этот вопрос касается подтверждения приведенных выше предположений, а также того, не понимаю ли я что-то неправильно и/или упускаю что-то.

Подробнее здесь: https://stackoverflow.com/questions/368 ... out-boxing

Вернуться в «C#»