这是重载方法的正确方法吗?

时间:2012-08-13 11:30:04

标签: c# overloading

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

我是否通过这种方式从重载方法中获益?我知道我可以通过分支在一个方法(使用默认值参数)中编写整个事物,但我现在正在尝试重载,我想知道是否继续这条路径。

    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;
        }

}

5 个答案:

答案 0 :(得分:1)

是的,没关系。

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

答案 1 :(得分:1)

是的,这就是重载的工作原理。

但是一个副节点:

  • 您是否需要使用不支持的语言代码? 可选参数?如果是这样,请考虑包含重载。
  • 您的团队中是否有任何成员强烈反对可选参数? (有时候做出决定会更容易 你不喜欢争辩这个案子。)
  • 您是否确信您的默认设置不会在代码构建之间发生变化,或者如果可能,您的呼叫者是否可以接受?

来源:Should you declare methods using overloads or optional parameters in C# 4.0?

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

有关默认参数的注意事项。

如果你有两个组件,A和B,A调用B中的函数。

如果更改B中的默认值:

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

使用重载只需要重新编译B。

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