gpt4 book ai didi

C# enum.ToString() 装箱 : resolve or supress?

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:27 24 4
gpt4 key购买 nike

最近我们安装了 Visual Studio 的“Clr Heap Allocation Analyzer”扩展,以检查我们的代码是否存在由装箱等引起的堆分配问题。我们遇到了警告“HAA0102”,它给出了以下描述:

Non-overridden virtual method call on a value type adds a boxing or constrained instruction

指的是下面这行代码中的条件检查:

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() 基本上是将其装箱到引用类型(字符串)。

我的问题是是否有必要重构这些类型的行以避免装箱(如果是这样......如何?)或者是否更好地抑制这些特定情况下的警告?请记住,我们确实需要保留枚举类型。它们用作提供用户选项(在下拉列表中)的受控方式。将它们重构为另一种类型将需要大量工作(如果性能会显着提高,这很好)。

提前致谢!

最佳答案

Enum 与 String 相比具有某些优势,即您添加了一个约束,即只有有效值才能出现在定义的枚举中。可以理解,您的 Web 服务器接收的是字符串,而不是枚举值,但正确的方法应该是将字符串强制转换为枚举值,然后比较枚举值。

强制字符串值当然会出错,所以这应该被认为是一个“验证步骤”。但是,一旦枚举值有效,您就不会遇到这种性质的问题,在我看来,这除了会导致性能下降外,还容易出错(如果您期望值与其中一个匹配,会发生什么情况?枚举值和没有?)。

// "Validation"
instanceType = (Enums.Tags) Enum.Parse(typeof(Enums.Tags), value)

// Usage
if(instanceType == Enums.Tags.DialoguePanel)
{
// Some code handling
}
else if(instanceType == Enums.Tags.InfoPanel)
{
// Some other code handling
}

关于C# enum.ToString() 装箱 : resolve or supress?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56785869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com