1

使用字符串而不是枚举进行比较是否常见?

4

6 回答 6

7

我知道您的上下文,但作为第一步,您可以这样重构:

步骤1

if (typeOfObject == "UAV")
{
    DoSomeWork(_stkObjectRootToIsolateForUavs);
}
else if (typeOfObject == "Entity")
{
    DoSomeWork(_stkObjectRootToIsolateForEntities);
}

private void DoSomeWork(IAgStkObject agStkObject)
{
    IAgStkObject stkObject = agStkObject.CurrentScenario.Children[stkObjectName];
    IAgDataProviderGroup group = (IAgDataProviderGroup)stkUavObject.DataProviders["Heading"];
    IAgDataProvider provider = (IAgDataProvider)group.Group["Fixed"];
    IAgDrResult result = ((IAgDataPrvTimeVar)provider).ExecSingle(_stkObjectRootToIsolateForUavs.CurrentTime);

    stkObjectHeadingAndVelocity[0] = (double)result.DataSets[1].GetValues().GetValue(0);
    stkObjectHeadingAndVelocity[1] = (double)result.DataSets[4].GetValues().GetValue(0);
}

然后考虑用 switch 替换 if :

第2步

switch (typeOfObject)
{
    case "UAV":
        DoSomeWork(_stkObjectRootToIsolateForUavs);
        break; 
    case "Entity":
        DoSomeWork(_stkObjectRootToIsolateForEntities);
        break;
    default:
        throw new NotImplementedException():
}

这在使用枚举时会更好。

于 2011-01-11T22:14:08.723 回答
3

至少,字符串应该在readonly某处声明为常量(或者可能是字段),而不是在代码中展开。但是,这看起来像教科书示例,说明何时使用enum.

public enum ObjectType
{
   UAV,
   Entity,
   // and so on
}
于 2011-01-11T22:11:22.493 回答
3

要添加到@Restuta 的答案,我会使用

IDictionary<MyEnumifiedString, Action<IAgStkObject>> 

摆脱那个如果。

于 2011-01-11T22:18:36.190 回答
0

关于您的第一个问题,我将始终使用定义的类型来存储字符串,以便在需要时有一个更改位置。

因此,对于您的示例,我将具有以下内容

public sealed class RootTypes
{
    public const string Entity = "entity";
    public const string UAV = "uav";
}

然后您的代码会更新为此

    typeOfObject = typeOfObject.ToLower();
    if (typeOfObject == RootTypes.UAV)
    {
        stkUavObject = _stkObjectRootToIsolateForUavs.CurrentScenario.Children[stkObjectName];
        var group = (IAgDataProviderGroup) stkUavObject.DataProviders["Heading"];
        var provider = (IAgDataProvider) group.Group["Fixed"];
        IAgDrResult result = ((IAgDataPrvTimeVar) provider).ExecSingle(_stkObjectRootToIsolateForUavs.CurrentTime);
        stkObjectHeadingAndVelocity[0] = (double) result.DataSets[1].GetValues().GetValue(0);
        stkObjectHeadingAndVelocity[1] = (double) result.DataSets[4].GetValues().GetValue(0);
    }
    else if (typeOfObject == RootTypes.Entity)
    {
        IAgStkObject stkEntityObject = _stkObjectRootToIsolateForEntities.CurrentScenario.Children[stkObjectName];
        var group = (IAgDataProviderGroup) stkEntityObject.DataProviders["Heading"];
        var provider = (IAgDataProvider) group.Group["Fixed"];
        IAgDrResult result = ((IAgDataPrvTimeVar) provider).ExecSingle(_stkObjectRootToIsolateForEntities.CurrentTime);
        stkObjectHeadingAndVelocity[0] = (double) result.DataSets[1].GetValues().GetValue(0);
        stkObjectHeadingAndVelocity[1] = (double) result.DataSets[4].GetValues().GetValue(0);
    }

Restuta已经回答了代码冗余的问题

于 2011-01-11T22:21:31.167 回答
0

我同意@Frederik 的观点,这似乎是使用枚举的完美案例,但您可以从应用程序中获得的唯一内容可能是字符串。在这种情况下,您的示例完全可以。

哦,是的——并确保你在一个地方定义了字符串常量,最好是一个配置文件,这样如果它们改变了另一个应用程序,你就不必重新编译你的。

于 2011-01-11T22:14:25.463 回答
-2

使用带有位标志的枚举:

[Flags]
public enum MyFlags
{
    SomeFlag = 0x1, // 001
    OtherFlag = 0x2,// 010
    ThirdFlag = 0x4 // 100
}

var firstObject = MyFlags.SomeFlag;
var secondObject = MyFlags.SomeFlag | MyFlags.OtherFlag;

if(((int)secondObject & MyFlags.SomeFlag) != 0) 
{
    // true
}

if(((int)secondObject & MyFlags.OtherFlag) != 0) 
{
    // true
}

if(((int)firstObject & MyFlags.SomeFlag) != 0) 
{
    // true
}

if(((int)firstObject & MyFlags.OtherFlag) != 0) 
{
    // false
}

这篇文章会有所帮助。

于 2011-01-11T22:16:22.417 回答