字符串或枚举,在C#中的性能表现

3

我有一个用户控件,其中包含一个类型为MyItem的项目集合,其外观如下:

public class MyItem
{
    // some other members
    public object Tag { get; set; }
}

我有许多类型的项目在集合中,当它们被点击时,我需要知道哪个被点击了,以便根据情况采取行动。
例如:
如果我有5个项目,如Type1、Type2、Type3、Type4和Type5,那么为了检查项目单击事件,我创建了一个枚举如下:
private enum MyTypeEnum
{
    Type1,
    Type2,
    Type3,
    Type4,
    Type5
}

将此内容放入MyItemTag属性中,如下所示:
MyItem m1 = new MyItem { Tag = MyTypeEnum.Type1 };
MyItem m2 = new MyItem { Tag = MyTypeEnum.Type2 };
MyItem m3 = new MyItem { Tag = MyTypeEnum.Type3 };
MyItem m4 = new MyItem { Tag = MyTypeEnum.Type4 };
MyItem m5 = new MyItem { Tag = MyTypeEnum.Type5 };

而在项目点击事件中,我会像这样检索它:

MyTypeEnum tag = (MyTypeEnum )item.Tag;

我知道当我将MyTypeEnum放入标签中时,我正在进行装箱操作,而在单击事件中检索它时,我正在进行拆箱操作。

我可以通过将string type放入标记中来避免这种情况。

我的问题是,就性能或架构(更好的做事方式)而言,哪个更好,enum还是string


5
为什么不能直接使用类型为MyTypeEnumTag - Rohit Vats
3
除了装箱之外,取决于您正在执行哪些操作。字符串比较速度比枚举比较慢。记住不要进行"微观优化"或"预先优化"。在大多数应用程序中,这不是问题。 - Gusdor
3
在你开始注意到这些属性之前,你必须多次阅读和编写它们。类型安全将是一个更大的问题,因为在开发过程中进行类型转换会花费你时间来查找错误。 - Emond
2
100个项目算不了什么,你花在提问上的时间比你能获得的更多。 - Emond
2
这感觉像是“过早优化”...即使执行了很多次,两种情况之间的差异也几乎不会被注意到,那么我真的怀疑当你点击按钮多次时是否能够注意到差异... - digEmAll
显示剩余4条评论
1个回答

0

就性能而言,它真的没有什么明显的差别。如果您使用枚举,则为每个值在堆上分配一个(装箱)对象。如果您使用字符串,则为每个值在堆上分配一个(稍大)对象。

装箱/拆箱只有在执行许多1,000或1,000,000次时才会成为性能问题。

从架构角度来看,最好的选择取决于您计划如何使用标记。

如果您只想确定单击事件的来源,则枚举可能是有益的,因为您可以在switch语句中使用它们。另一方面,您可以将字符串用作字典中的键。我会选择使您的代码更清晰、更易于维护的任何方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接