- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
最近我们安装了 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/
我在我的 android 应用程序中使用 ViewModelFactory 将一些数据从 Fragment 传递给我的 ViewModel。我收到未经检查的类型转换警告。如果我使用抑制,警告就会消失。
最近我们安装了 Visual Studio 的“Clr Heap Allocation Analyzer”扩展,以检查我们的代码是否存在由装箱等引起的堆分配问题。我们遇到了警告“HAA0102”,它给
我有一个遗留代码库,我想向其中添加一整套检查样式检查,以便将来代码库更改将符合检查要求。 我知道我必须将所有现有故障放入 suppressions.xml 文件中。有没有办法从现有的 checksty
我在 MSVC 输出窗口显示“正在生成代码...”后收到警告。 1>Note: including file: D:\FOO\INC\ippcc.h 1>Generating Code... 1>d:
考虑 Bokeh 中的条形图(python) http://docs.bokeh.org/en/0.11.0/docs/user_guide/charts.html 在 Y 轴上,我们总是看到类似“S
我正在努力遵守新项目的 VS2005 代码分析规则。我有这个方法: public void Dispose() { Console.WriteLine("Dispose() called");
当使用 swig 生成 python 包装器时,生成的 python 文件中的 python 包装器类没有显式的 self 参数,例如如下所示: class PySwigIterator(_objec
我查看了几篇文章,但找不到可行的解决方案。 我的问题很简单: 我有一个包含 id、url 和 title 的实体。 URL 应该是唯一的(在 MySQL PDO 中)。我成功地创建了实体和模式,没有任
我是一名优秀的程序员,十分优秀!