为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法在 switch 语句中输入所有事例?

有没有办法在 switch 语句中输入所有事例?

C#
冉冉说 2022-08-20 15:18:20
我正在使用一个 switch 语句,该语句设置依赖于案例的对象的某些属性 - 一个新的要求是添加一个 case 语句 “All” 来实质上执行所有案例以应用所有字段 - 用于特殊情况。我真的找不到一个很好的解决方案,每个case语句只设置1-2个属性值,所以不值得将逻辑分离到方法中。但是,我也不想有大量重复的代码。var person = new Person();switch (PersonEnum){    case PersonEnum.Name:        person.Name = ...        break;    case PersonEnum.Age:        person.Age = ...       break;     case PersonEnum.All:       person.Name = ...                person.Age = ...       break;上面的示例代码是我正在处理的内容的简化版本,但这个想法仍然适用。
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

使用 Flags 枚举会更实用。在这种情况下,您可以执行如下操作:


if (PersonEnum.HasFlag(PersonEnum.Name)) // Name is set. HasFlag is equivalent to (PersonEnum & PersonEnum.Name) != 0

{

    person.Name = ...

}


if (PersonEnum.HasFlag(PersonEnum.Age)) // Age is set

{

    person.Age = ...

}

...

在这种情况下,您甚至不需要检查PersonEnum.All


您的枚举应如下所示:


[Flags]

enum PersonEnum 

{

  Name = 1,

  Age = 2,

  LastName = 4,

  ...

  NameAndAge = Name | Age,

  All = Name | Age | LastName ...

}


查看完整回答
反对 回复 2022-08-20
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

您可以将其分成 if 语句,以稍微减少代码


if (PersonEnum == PersonEnum.All || PersonEnum == PersonEnum.Name)

   person.Name = ...

if (PersonEnum == PersonEnum.All || PersonEnum == PersonEnum.Age)

   person.Age = ...


查看完整回答
反对 回复 2022-08-20
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

实际上有一种方法可以做到这一点,它不如Java支持的falls那么好,但是你可以实现类似的东西,是的,它就是这样。应该指出的是,尽管与goto语句相关的污名化,但也许这是一个可以接受的地方,最好是代码简短,简洁且易于阅读。goto


但是,对于此特定方案,它可能不是最佳选择。这里更好的选择是工厂模式。


switch (personEnum)

{

  case PersonEnum.Name:

    person.Name = "";

    goto case PersonEnum.Age;

  case PersonEnum.Age:

    ...


查看完整回答
反对 回复 2022-08-20
  • 3 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信