【问题标题】:Should I created class or create if?我应该创建类还是创建 if?
【发布时间】:2012-12-04 01:29:55
【问题描述】:

我有一个情况:

我需要为班级做点什么。

什么应该更有效,以这种方式修改方法,使用 IF 或为每个操作创建方法?

public value Value(int command)
        {
            if (command == 1)
            {
                DoSomething1();
            }

            if (command == 2)
            {
                DoSomething2();
            }
            else
            {
                return empty();
            }


        }

将会有 50 多个这样的命令。 就执行性能和可执行文件的大小而言,哪一个更好?

【问题讨论】:

  • 第一课:在真正成为问题之前不要担心性能。任何针对您的特定问题的解决方案都不会导致性能问题。
  • 要扩展 Simon Whitehead 所说的内容,请注意可读性。编写代码时,可读性应该是您最关心的问题。

标签: c# .net windows coding-style


【解决方案1】:

在高层次上,您似乎正在尝试实现某种动态调度系统?或者您只是想在没有任何多态性的情况下执行指定的操作?很难说。

无论如何,根据您给出的示例,switch 块将是性能最高的,因为 JIT 编译器将其转换为有效的哈希表查找而不是一系列比较,所以只需这样做:

enum Command { // observe how I use an enum instead "magic" integers
    DoSomethingX = 1,
    DoSomethingY = 2
}

public Value GetValue(Command command) {
    switch(command) {
        case Command.DoSomethingX: return DoSomethingX();
        case Command.DoSomethingY: return DoSomethingY();
        default: return GetEmpty();
    }
}

我还注意到switch 块也意味着您可以获得更紧凑的代码。

【讨论】:

  • 对枚举也 +1 以提高可读性和可维护性。与任何小的性能提升相比,这将大大改善程序。
  • 你可以设置一个静态的命令和动作字典,然后GetValue变成一个简单的字典查找。
  • @Dai 谢谢。我这样做是为了在多线程程序中返回一个带有参数的线程。你会推荐一个切换多个 CS 文件的方法吗?
  • 如果不了解您的程序,我无法推荐任何东西,但老实说,听起来您确实不知道自己在做什么(在更高级别)。
【解决方案2】:

这不是一个性能问题,而是一个范式问题。

在 C# 中,方法应该是任务的封装。您在这里拥有的是一大堆任务,每个任务都不相关。这不应该是单一的方法。想象一下,将来尝试保持这种方法。想象一下尝试调试它,想知道在调用每个位时您在方法中的什么位置。

如果你把它分开,你的生活会容易得多,尽管性能可能没有任何区别。

【讨论】:

    【解决方案3】:

    虽然单独的方法在性能方面几乎肯定会更好,但您不太可能注意到差异。但是,拥有单独的方法肯定会大大提高可读性,这一点更为重要。

    【讨论】:

    • 应该这个更多的 50.CS 文件会创建一个更大的 EXE 吗?
    • @RicardoPolo 不是重要的 EXE 部分:您可能会在其中获得更多符号,但可执行代码本身可能会更短。
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多