在switch语句中针对枚举进行编程,这是你的方式吗?看一下代码片段:这是我通常在编写枚举时所做的。我有一个带有InvalidOperationException的默认转义(我不使用ArgumentException或其衍生物之一,因为编码是针对私有实例字段而不是传入参数)。我想知道你们的开发人员是否也写过这个逃生的想法......publicenumDrivingState{Neutral,Drive,Parking,Reverse};publicclassMyHelper{privateDrivingStatedrivingState=DrivingState.Neutral;publicvoidRun(){switch(this.drivingState){caseDrivingState.Neutral:DoNeutral();休息;案例DrivingState.Drive:DoDrive();休息;案例DrivingState.Parking:DoPark();休息;案例DrivingState.Reverse:DoReverse();休息;默认值:抛出新的InvalidOperationException(string.Format(CultureInfo.CurrentCulture,"Drivestate{0}isanunknownstate",this.drivingState));在代码审查中,我在默认的转义实现中遇到了很多只有break的语句。随着时间的推移,这可能会成为一个问题……我不喜欢这种方法,因为默认值是不可测试的。这会导致单元测试的覆盖率降低,这不一定是世界末日,但我厌倦了强迫症。我宁愿简单地对每个案例进行单元测试,并附加断言只有四种可能的案例。如果有人添加新的枚举值,单元测试就会中断。Like[Test]publicvoidShouldOnlyHaveFourStates(){Assert.That(Enum.GetValues(typeof(DrivingState)).Length==4,"为你的新DrivingState更新单元测试!!!");你的问题有点模糊,但据我了解,你是在问我们你的编码风格是否合适。我通常根据可读性来判断编码风格。我读了一遍代码就明白了。因此,在我看来,您的代码是良好编码风格的示例。另一种选择是使用类似于Java枚举的东西。私有嵌套类型允许“更严格”的枚举,其中编译时可用的唯一“无效”值是null。这是一个例子:usingSystem;公共抽象类DrivingState{publicstaticreadonlyDrivingStateNeutral=newNeutralState();publicstaticreadonlyDrivingStateDrive=newDriveState();publicstaticreadonlyDrivingStateParking=newParkingState();publicstaticreadonlyDrivingStateReverse=newReverseState();//只有嵌套类可以派生自这个privateDrivingState(){}publicabstractvoidGo();privateclassNeutralState:DrivingState{publicoverridevoidGo(){Console.WriteLine("哪儿也不去......");}}privateclassDriveState:DrivingState{publicoverridevoidGo(){Console.WriteLine("Cruising...");}}privateclassParkingState:DrivingState{publicoverridevoidGo(){Console.WriteLine("Can'tdrivewiththehandbrakeon...");}}privateclassReverseState:DrivingState{publicoverridevoidGo(){Console.WriteLine("小心我身后!");}}}这个看起来很合理。还有一些其他选项,例如Dictionary,但您拥有的更简单,应该足以满足大多数简单情况。总是喜欢简单易读;-p这可能与主题有关,但也可能不是。检查必须存在的原因是设计不断发展,您必须向枚举添加新状态。所以也许你一开始就不应该这样工作。怎么样:interfaceIDrivingState{voidDo();将当前状态(实现IDrivingState的对象)存储在一个变量中,然后像这样执行它:drivingState.Do();大概你可以以某种方式让一个国家过渡到另一个国家——也许Do会回到新的国家。现在您可以扩展您的设计而不会使所有现有代码失效。根据评论更新:通过使用枚举/开关,当您添加新的枚举值时,您现在需要找到代码中尚未处理该枚举值的每个地方。编译器不知道如何帮助它。代码的各个部分之间仍然存在“契约”,但它是隐含的,编译器不可能检查它。多态方法的优点是设计更改最初会导致编译器错误。编译错误没关系!编译器有效地为您提供了代码中需要修改以响应设计更改的地方的清单。通过以这种方式设计代码,您将获得强大的“搜索引擎”的帮助,它可以理解您的代码并通过在编译时发现问题而不是让它们在运行时解决问题来帮助您改进。我会使用NotSupportedException。NotImplementedException用于未实现的功能,但默认情况下已实现。你只是选择不支持它。我只建议在开发期间为存根方法抛出NotImplementedException。如果您想抛出异常,我建议使用NotImplementedException或更好的自定义DrivingStateNotImplementedException。我呢,我会默认默认的驾驶状态(比如空档/停车),然后记录失踪的司机(因为那是你错过的驾驶状态,而不是客户端)就像一辆真正的汽车,cpu决定它不能播放打开灯,它做什么,抛出异常并“中断”所有控制,或者返回到安全的已知状态并警告驱动程序“oi,我没有灯”如果遇到未处理的枚举值,你应该做什么做视情况而定。有时只处理某些值是完全合法的。如果您有一个错误的unhandles值,您一定会像示例中那样抛出异常(或以其他方式处理错误)。当没有迹象表明出现问题时,不应吞下错误条件。只有breakdefault的情况不是很好。我会删除它以指示开关不处理所有值,并可能添加注释解释原因。清晰,明显和正确的方法。如果DrivingState需要改变,你可能需要重构。上面所有复杂的多态恐怖的问题是它们强制封装到一个类中或需要额外的类——当只有一个DrivingState.Drive()方法时很好,但是一旦你有一个DrivingState.Serialize()它就会破坏整个事物。序列化到某处依赖于DrivingState或任何其他真实条件的方法。枚举和开关是由彼此组成的。我是一名C程序员,而不是C#,但是当我有这样的事情时,如果不是所有枚举案例都在开关中处理,我的编译器设置会发出警告。一旦设置(和警告作为错误设置),我就不会为可以在编译时捕获的运行时检查而烦恼。这可以在C#中完成吗?我从不使用开关。与您所展示的类似的代码一直是我使用过的大多数框架中的主要痛点——不可扩展且固定为有限数量的预定义案例。这是一个很好的例子,说明可以用简单的多态性以一种漂亮、干净和可扩展的方式完成什么。只需声明一个基础DrivingStrategy,DrivingStrategy就会继承所有版本的驾驶逻辑。这不是过度工程-如果您有两个案例,但有四个案例表明需要,特别是如果每??个版本的Do...都调用其他方法。至少那是我的个人经历。除非确实有必要,否则我不同意JonSkeet冻结多个州的解决方案。我不认为使用枚举类型和switch语句来实现状态(也是状态设计模式)不是一个特别好的主意。恕我直言,这很容易出错。随着正在实施的状态机变得复杂,代码将逐渐降低程序员的可读性。目前它非常干净,但不知道这个枚举的确切意图,很难说它会如何随着时间的推移而演变。另外,我想在这里问你——有多少操作适用于DrivingState以及Run()?如果有多个,如果您基本上要多次复制switch语句,那么至少可以说这是一个有问题的设计。以上就是C#学习教程:switch语句中的枚举编程,这是你的方法吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
