Сравнение структур на равенство без упаковки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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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