最近我们在Visual Studio中安装了“Clr Heap Allocation Analyzer”扩展程序,以检查我们的代码中由装箱等原因引起的堆分配问题。我们遇到了“HAA0102”警告,该警告给出以下描述:
非覆盖值类型上的虚方法调用添加了Boxing或Constrained指令。
它是指以下代码行中的条件检查:
现在我明白
非覆盖值类型上的虚方法调用添加了Boxing或Constrained指令。
它是指以下代码行中的条件检查:
if(instanceType == Enums.Tags.DialoguePanel.ToString())
{
// Some code handling
}
else if(instanceType == Enums.Tags.InfoPanel.ToString())
{
// Some other code handling
}
为了提供背景信息,Enums.Tags.DialoguePanel 指的是以下枚举声明:
public enum Tags
{
InfoPanel,
DialoguePanel,
WarningPanel
}
现在我明白
enum
是值类型,因此Enums.Tags.DialoguePanel
也是值类型。我也知道.ToString()
基本上是将其装箱到引用类型(字符串)。我的问题是,是否有必要重构这些行以避免装箱(如果需要,如何处理?),或者是否最好针对这些特定情况抑制此警告?请记住,我们确实需要保留枚举类型。它们被用作提供用户选项的受控方式(在下拉列表中)。重构这些枚举类型以成为另一种类型将需要大量工作(如果性能显着提高,则可以接受)。
ToString
?为什么不直接与实际的枚举值进行比较?” - MakePeaceGreatAgainnameof(Enums.Tag.InfoPanel)
而不是调用ToString。 - ckurinameof
,这将把字符串编译为常量并嵌入到编译后的代码中,而不是每次调用.ToString()
时都产生新的字符串。很可能这也会消除警告。 - Lasse V. Karlsen