我正在编写一些通用的辅助方法,希望在值为其类型的默认值时能够调用特殊处理。对于引用类型来说,这很容易 - 默认值是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在如何直接访问结构体的位上发布了一个答案;我添加了一个使用它来检测可能未初始化值的实现。
FastEqualsCheck
和CanCompareBits
。 - user541686