【问题标题】:Using properties in switch statement cases?在 switch 语句案例中使用属性?
【发布时间】:2009-08-04 18:35:59
【问题描述】:

我在一个类中有一个 switch 语句,它根据代码文件中的某一行是否匹配该 Command 对象的特定代码来生成 Command 对象。

像这样:

switch (line):
{
   case "#CODE1":
      return new Command1();
   case "#CODE2":
      return new Command2();
}

我想把它变成这样的:

switch (line):
{
   case Command1.Code:
      return new Command1();
   case Command2.Code:
      return new Command2();
}

我通过创建 Command1 的公共静态属性进行了尝试,但编译器抱怨...

有没有办法按照这个意图做一些编译器不会抱怨的事情?

【问题讨论】:

    标签: c# .net refactoring switch-statement


    【解决方案1】:

    我认为您只能使用常量来做到这一点...所以如果可能的话,请使用常量字段而不是公共静态属性。不同之处在于它在编译时被视为文字,因此如果值更改,则需要重新编译所有引用该常量的程序集。

    【讨论】:

      【解决方案2】:

      Switch 仅适用于数字类型和字符串类型,不适用于属性。您可以尝试在您的 Command1 和 Command2 类上定义一个公共字符串常量,您应该可以打开它。

      public class Command1 
      {
         public string const Code = "#CODE1";
      }
      

      【讨论】:

        【解决方案3】:

        由于您使用的是字符串,我不确定这是否是最好的方法,但使用枚举对我有用

        enum CommandEnum { CommandOne, ComandTwo, CommandN }
        //...
        
        CommandEnum myCommand;
        //...
        switch (myCommand)
        {
          case myCommand.CommandOne:
               return new Command1();
          case myCommand.CommandTwo:
               return new Command2();
          //...
        }
        

        【讨论】:

          【解决方案4】:

          你总是可以依靠经过验证的 if / else 块

           if (line == Command1.Code)
            return new Command1();
           else if (line == Command2.Code)
            return new Command2();
          

          这不是那么邪恶,是吗?

          【讨论】:

          • 不,不是那么邪恶......我必须这样做 :) 我使用了一个名为“代码”的静态只读变量
          【解决方案5】:

          我认为您的问题是您需要先实例化您的对象,然后才能确定它们的属性值。

          我假设您有一个带有标记化指令的代码文件,例如:

          #CODE1
          #CODE2
          

          并且您希望一个类读取文件的每一行,然后执行令牌定义的任何指令。

          您让它工作了,但不是直接与文件中的标记进行字符串比较,而是希望将标记的值存储在对象的属性中?这种方法的问题是您必须先创建对象的新实例(命令 1 和 2),然后才能引用它们的属性值。

          如果我了解您所做的事情以及您想要做的事情,我认为您的解决方案是好的。不过,我不是 100% 确定我真的了解您想要做什么,或者为什么。

          HTH

          【讨论】:

          • 我不喜欢需要“记忆”的字符串常量。我希望它们附加到各自的命令中。这种方式不可能出现错别字。 Intellisense 会捕捉到它们。
          • 是的,但您的代码文件中仍然可能有拼写错误。关键是做你想做的事,你必须先实例化变量。检查属性值后无法创建新实例,必须先创建实例才能检查值。
          • 阅读下面的评论后,我不确定为什么编译器会抱怨 switch 语句而不是 if/then/else。我以为它在抱怨您的对象引用,尽管这并不清楚。如果你让它与 if/then/else 结构一起工作,然后你把它改回 switch,你仍然从编译器收到错误吗??
          【解决方案6】:

          如果你想检查一个类的属性。我假设您可能希望能够更改这些属性并进行相应的检查。您必须使用 if、else if、else if 类型语句。

          如果您有一个 jones 可以使用 switch 语句,那么您就是 SOL,除非您根据常量值检查整数类型。 if、else if、else if 块很难看,但它会做你想要的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-23
            • 2021-03-22
            • 2014-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多