0

我正在开发自己的命令行参数解析器,在阅读了数十篇关于方法重载的文章后,我仍然不确定我是否做得对。

我是否从这种重载方法中获得任何好处?我知道我可以通过分支在一个方法(使用默认值参数)中编写整个内容,但我目前正在尝试重载,我想知道是否继续这条路径。

    public static class MyParsers
    {
        private static List<string> args;

        static MyParsers()
        {
            args = Environment.GetCommandLineArgs().ToList();
        }

        public static List<string> ParseOptions()
        {
            return ParseOptions(false);
        }

        public static List<string> ParseOptions(bool toLowercase)
        {
            // DEBUG: Change command line arguments here.
            var arguments = args;
            return !toLowercase
                       ? arguments
                       : arguments.MyExtToLower();
        }

        public static bool OptionExists(string option)
        {
            return OptionExists(option, false);
        }

        public static bool OptionExists(string option, bool toLowercase)
        {
            var list = ParseOptions(toLowercase);
            for (var i = 1; i < list.Count; i++)
            {
                if (list[i].StartsWith(option)) return true;
            }
            return false;
        }

}
4

5 回答 5

1

是的,没关系。

如您所知,如果您的重载仅调用具有默认值的另一个方法(这将减少代码行数),您也可以使用带有默认值的可选参数。

于 2012-08-13T11:33:37.300 回答
1

是的,这就是重载的工作方式。

但是一个侧节点:

  • 您是否需要从不支持可选参数的语言中使用您的代码?如果是这样,请考虑包括重载。
  • 您的团队中是否有任何成员强烈反对可选参数?(有时,接受一个你不喜欢的决定比争论这个案子更容易。)
  • 您是否确信您的默认值不会在代码构建之间发生变化,或者如果可能,您的调用者会同意吗?

资料来源:您应该在 C# 4.0 中使用重载或可选参数声明方法吗?

于 2012-08-13T11:35:55.910 回答
1

带有可选参数的“问题”是,如果在您的程序集 A 的某个未来版本 X 中更改了默认值,那么任何引用 A 的客户端程序集 C都需要重新编译才能“看到”更改——加载更新的A 的版本将导致他们使用旧的默认值调用新方法。

如果这不是潜在问题,那么使用可选参数会更方便。使用多个重载模拟可选参数的等效版本没有这个问题,因为在这种情况下,默认值被烘焙到程序集 A 而不是 C 中。

于 2012-08-13T11:37:43.420 回答
1

我认为你的超载风格很好。

如果您认为您可能有大量不同的解析参数(ToUpperCase 等),而不是一个具有许多重载方法的类,您可能会考虑使用对象继承并拥有 LowerCaseParser、CamelCaseParser 等...

于 2012-08-13T11:37:45.963 回答
1

是的,这是使用重载的正确方法。

关于默认参数需要注意的一件事。

如果您有两个程序集 A 和 B,则 A 调用 B 中的函数。

如果更改 B 中的默认值:

使用参数的默认值,您需要重新编译程序集 A 和 B 才能使此更改生效

使用重载你只需要重新编译 B.

这是因为对于默认参数,编译器在编译时会插入默认值。

于 2012-08-13T11:39:04.340 回答