使用字符串进行比较而不是枚举是否常见?
答案 0 :(得分: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():
}
使用枚举时可能会更好。
答案 1 :(得分:3)
至少,字符串应该在某处声明为常量(或者readonly
字段),而不是通过代码展开。但是,这看起来像是何时使用enum
的教科书示例。
public enum ObjectType
{
UAV,
Entity,
// and so on
}
答案 2 :(得分:3)
要添加@ Restuta的答案,我会使用
IDictionary<MyEnumifiedString, Action<IAgStkObject>>
去掉那个。
答案 3 :(得分:0)
我同意@Frederik的说法,这似乎是使用枚举的完美案例,但可能是你可以从应用程序中获得的唯一一个字符串。在这种情况下,你的例子完全没问题。
哦,是的 - 并确保在一个地方定义了字符串常量,最好是配置文件,这样如果他们更改了其他应用程序,则不必重新编译它。
答案 4 :(得分: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
已经解决了代码冗余问题答案 5 :(得分:-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
}
This article会有所帮助。