Для некоторых общих вспомогательных методов, которые я пишу, я хотел бы иметь возможность вызывать специальную обработку, когда это значение является значением по умолчанию для его типа.Для справочных типов это просто - значение по умолчанию null
.Я не могу использовать параметр общего типа, хотя я мог бы обойти это.
Я могу сделать что-то вроде этого:
public bool DetectPossiblyUninitializedValue(object val) {
return val== null ||
val.GetType().IsValueType
&& Equals(val, Activator.CreateInstance(val.GetType());
}
Это то, что я сейчас использую, но этозависит от реализации Equals
.Это хорошо, но не идеально.В частности, некоторые реализации могут переопределять Equals для поддержки более удобной семантики в обычных сценариях.На самом деле это не редкость, если рассматривать значение по умолчанию как особенное здесь, потому что оно неизбежно в .NET из-за инициализации по умолчанию.
Однако в этом случае я просто хочу знать, мог ли объект быть инициализирован, иПоэтому я не хочу никакого пользовательского равенства или чего-то еще.По сути, я хочу знать, заполнена ли область памяти, которую занимает структура, нулями, поскольку VM гарантирует после инициализации, и не более.В некотором смысле я ищу что-то похожее на ReferenceEquals
для структур: сравнение без учета собственной реализации базового объекта.
Как я могу сравнивать необработанные значения структуры без использования Equals
?Могу ли я вообще сравнивать необработанные значения структуры?
Редактировать: Я использую это для соединения классов + структур, представляющих доменные понятия, связанные по существу произвольным кодом, представляющимразличные бизнес-правила для GUI.Некоторый старый код по существу имеет дело с возможно вложенными словарями строк в произвольные объекты, что, таким образом, требует кучу непроверенных приведений или dynamic
;их создание подвержено ошибкам.Так что приятно иметь возможность работать с типизированными объектами относительно напрямую.С другой стороны, для GUI и кода переноса полезно по-разному обрабатывать неинициализированные значения;и хотя в каждом конкретном случае возможно решение типа за типом, это много кода;разумное значение по умолчанию полезно.На самом деле мне нужен метод автоматической генерации типа, идентичного другому, но со всеми свойствами / открытыми полями, расширенными для включения значения «неинициализированным», но это нереалистичная функция, чтобы ожидать - в отличие от динамического мира, это было бытривиально достижимо, но без защиты типов в других местах ...
Ответы: Mehrdad опубликовал ответ на , как получить прямой доступ к битам структур ;Я добавил реализацию, использующую это для обнаружения возможно неинициализированных значений .