首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#优化质量比较

C#优化质量比较
EN

Stack Overflow用户
提问于 2015-03-25 13:11:22
回答 5查看 173关注 0票数 0

是否有方法优化下列代码:

代码语言:javascript
复制
enum ObjType
{
    A,
    B,
    C,
    D,
    E,
    F,
    G,
    H
}
...
if (instance.ObjType == ObjType.B
    || instance.ObjType == ObjType.D
    || instance.ObjType == ObjType.E
    || instance.ObjType == ObjType.F
    || instance.ObjType == ObjType.G
    || instance.ObjType == ObjType.H)
    doSmth();

以下解决方案不适合我:

代码语言:javascript
复制
if (instance.ObjType >= ObjType.B)
    doSmth();

因为不同的情况需要对不同的ObjType组合进行大量的比较。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-03-25 13:26:00

您可以将枚举定义为标志枚举。

代码语言:javascript
复制
[Flags]
enum ObjType
{
    None = 0,
    A = 1 << 0,
    B = 1 << 1,
    C = 1 << 2,
    D = 1 << 3,
    E = 1 << 4,
    F = 1 << 5,
    G = 1 << 6,
    H = 1 << 7,
    MyCombination1 = A | B | D,
    MyCombination2 = C | F | G | H
}

像这样,您可以定义多达32个值(加上None = 0和任意数量的其他值组合),也可以定义多达64个值

代码语言:javascript
复制
[Flags]
enum ObjType : long
{
    None = 0,
    A = 1L << 0,
    B = 1L << 1,
    ...
}

现在你可以比较

代码语言:javascript
复制
if (instance.ObjType & ObjType.MyCombination1 != ObjType.None) {
   ...
}

如果枚举本身更适合您的需要,也可以在枚举之外定义常量。

代码语言:javascript
复制
private const ObjType AdHocCombination = ObjType.A | ObjType.C | ObjType.H;

在定义标志时,值必须具有2的幂(None除外)。这很容易通过使用左移位操作符<<来实现。

票数 1
EN

Stack Overflow用户

发布于 2015-03-25 13:17:13

如果手动分配这些值,如下所示

代码语言:javascript
复制
enum ObjType
{
    A = 1,
    B = 2,
    C = 3,
    ...
    H = 8
}

您将能够使用数字比较。

同样,如果使用枚举标志,则可以使用位掩蔽:

代码语言:javascript
复制
[Flags]
enum ObjType
{
    A = 1,
    B = 2,
    C = 4,
    ...
    H = 256
}

if (((ObjType.A | ObjType.B | ObjType.C) & val) != 0) {
    ...
}
票数 2
EN

Stack Overflow用户

发布于 2015-03-25 13:15:40

一般来说,您的代码没有任何问题。这是惯用的C#。

如果您所说的“优化”指的是“消除所有冗余”,我建议如下:

代码语言:javascript
复制
var relevantTypes = new[] { ObjType.B, ObjType.D, ObjType.E, ... };

if (relevantTypes.Contains(instance.ObjType))
    doSmth();

局部变量只是一个例子,我个人认为它是一个private static readonly字段(因为您不能拥有一个const数组)。

如果您明智地选择名称,这也会使您的代码自文档化:

代码语言:javascript
复制
if (FooableTypes.Contains(instance.ObjType))
    doSmth();

if (TypesComparableToBar.Contains(instance.ObjType))
    doSmthElse();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29256645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档