我看到this answer to a similar question,但它总是让我害怕硬编码这些类型的值(特别是因为我希望我的应用程序在Windows和Mono上运行)。我可以在代码中使用REGDB_E_CLASSNOTREG定义的常量吗?
答案 0 :(得分:3)
我可以在代码中使用
REGDB_E_CLASSNOTREG
定义的常量吗?
Snarky回答:
是的,它看起来像这样:
public const int REGDB_E_CLASSNOTREG = unchecked((int)0x80040154);
真实回答:
不,.NET Framework中没有任何公开内容可以为您定义该值。首先抛出COMException
的事实表明特定错误代码(实际上是由基础COM函数返回的HRESULT
值)不是.NET Framework识别的错误代码和自动映射到更具体和信息丰富的异常类型。正如documentation所示,COMException
实际上是一个包含ErrorCode
属性的通用异常,因此您可以检查被调用方返回的HRESULT
并确定基础一般例外的原因。
这些HRESULT
值实际上是在Windows SDK附带的Windows头文件中定义的。在使用C或C ++编写Windows应用程序时,您会#include
这些标题,但在.NET的托管环境中,您需要通过将适当的定义复制到源文件中来自己定义它们。
好消息是,至少在Windows上,这个价值不太可能发生变化,因为向后兼容性有多重要,有多少应用程序会破坏。像这样的值可以合理地假设为常量。尽管如此,我仍然不会将它们硬编码为“神奇数字”。通过定义一个公共常量(如上所述),它做更改,您只需要在一个地方更改代码然后重新编译。
就Mono而言,如果他们需要这个值,他们最终将完成与上述相同的事情。在他们的运行时版本的源文件中的某个地方有一堆声明,如internal const int ...
。