【问题标题】:How to use switch case block in c# properly?如何在 c# 中正确使用 switch case 块?
【发布时间】:2012-07-13 03:19:05
【问题描述】:

我在 c# 中有一个 switch case 语句,这里所有的 case 我都作为私有常量,这里有什么不好的编程习惯,或者我需要在这里使用枚举,在 case 块中使用枚举器。我只有三个常量这里显示,我有十个常量和十个案例块

private const String FEASIBLESIZE = "Total FEASIBLESIZE";
private const String AVAILABLESIZE = "Total AVAILABLESIZE";
private const String EXCESSSIZE = "Total EXCESSSIZE";
                          .
                          . 
switch (value.ToString())
{
    case FEASIBLESIZE:
        Level.Add(TEAMSIZE, test.ToString());
        break;

    case AVAILABLESIZE:
        Level.Add(BROADSIZE, test.ToString());                                
        break;

    case EXCESSSIZE:
        Level.Add(NARROWSIZE, test.ToString());
        break;
         .
         .
         .

【问题讨论】:

  • ALLCAPS 使您的 C# 代码看起来像 70 年代初用 COBOL 编写的代码。
  • 这里有异味。为什么要将 Value 转换为字符串?
  • c#中常使用大写的常量,就是这种情况。
  • @TomasGrosup,是的,正如我们在这个问题中看到的那样,不幸的是,情况仍然如此。但这并不意味着standard C# naming conventions 推荐它。让我引用:Do not use SCREAMING_CAPS。所以,是的,有些人仍在使用这个完全可怕的约定这一事实并不意味着这是 C# 标准约定。

标签: c# switch-statement


【解决方案1】:

糟糕的编程习惯:

private const String FEASIBLESIZE = "Total FEASIBLESIZE";

良好的编程习惯:

private const String FEASIBLE_SIZE = "Total FEASIBLESIZE";

更好的编程实践:

private const String FeasibleSize = "Total FEASIBLESIZE";

【讨论】:

  • FEASIBLE_SIZE 是对 FEASIBLESIZE 的明确改进,但 AFAIK 推荐的 c# 样式是 FeasibleSize。 stackoverflow.com/questions/242534/….
  • @AlanT: AFAIK FeasibleSize 用于变量,FEASIBLE_SIZE 用于常量。
【解决方案2】:

您的常量似乎是 Enum 的候选者,我会选择 Enum 而不是 const 这里....

【讨论】:

  • 好它对性能有影响吗?我想是的,你能解释一下原因吗?
  • 根据您的 const 值,它们看起来都描述了 Size,因此它们是一种组,因此最好将它们分组到 Enum 中。而且我认为开关情况下的枚举比较应该更快。
  • @vettori Oded 的解决方案没有让您印象深刻吗?如果我的逻辑允许,我会按照他的建议去做......你仍然可以去 Enum the Dictionary 变成 Dictionary
【解决方案3】:

您正在做的事情看起来可以使用从一种尺寸类型到另一种尺寸类型的Dictionary<string,string> 映射来替换。

var sizeMap = new Dictionary<string,string>();

sizeMap.Add(FEASIBLESIZE, TEAMSIZE);
sizeMap.Add(AVAILABLESIZE, BROADSIZE);
sizeMap.Add(EXCESSSIZE, NARROWSIZE);

而不是开关:

Level.Add(sizeMap[value.ToString()], test.ToString());

【讨论】:

    【解决方案4】:

    请尝试使用大括号来限定大小写,这只是个人风格,但在代码行数增加时会有所帮助,并且始终使用默认值:too

    case FEASIBLESIZE:
    {
      Level.Add(TEAMSIZE, test.ToString());
      break;
    }
    default:
    ///...
    break;
    

    【讨论】:

      【解决方案5】:

      除了可怕的格式之外,它看起来大致还可以。当然,如果不真正了解您的代码,这有点难以判断。不过 Darin 是正确的,因为您没有遵守默认的命名约定(在 C# 中的任何地方都不允许使用大写字母)。

      但我看到过更糟的情况,如果这是任何安慰的话。

      【讨论】:

      • +1 I have seen much worse, if that's any consolation :-)
      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 2021-12-13
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      相关资源
      最近更新 更多