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

C# 这是重载方法的正确方法吗?,c#,overloading,C#,Overloading,我正在开发自己的命令行参数解析器,在阅读了几十篇关于方法重载的文章之后,我仍然不确定我是否做对了 这样重载方法对我有什么好处吗?我知道我可以通过分支在一个方法(使用默认值参数)中编写整个过程,但我目前正在尝试重载,我想知道是否继续这条路径 public static class MyParsers { private static List<string> args; static MyParsers() {

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


这样重载方法对我有什么好处吗?我知道我可以通过分支在一个方法(使用默认值参数)中编写整个过程,但我目前正在尝试重载,我想知道是否继续这条路径

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

}
公共静态类MyParser
{
私有静态列表参数;
静态MyParsers()
{
args=Environment.GetCommandLineArgs().ToList();
}
公共静态列表解析选项()
{
返回ParseOptions(false);
}
公共静态列表解析选项(bool-toLowercase)
{
//调试:在此处更改命令行参数。
var参数=args;
返回!toLowercase
?论据
:arguments.MyExtToLower();
}
公共静态bool OptionExists(字符串选项)
{
返回OptionExists(option,false);
}
公共静态bool OptionExists(字符串选项,bool-toLowercase)
{
var list=ParseOptions(toLowercase);
对于(变量i=1;i
是的,很好

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

是的,这很好


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

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

但是一个侧节点:

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

来源:

是的,重载就是这样工作的

但是一个侧节点:

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

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

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

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


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

我认为您的重载风格很好

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

< P>我认为你的超载风格很好。 如果您认为可能有大量不同的解析参数(ToUpperCase等)
而不是有一个类有很多重载的方法,你可能会考虑使用对象继承,并有一个LealReCasePalter,CamelCaseParser etc.…

< P>是的,这是正确使用重载的方法。 关于默认参数,需要注意一点

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

如果更改B中的默认值:

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

使用重载,您只需要重新编译B


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

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

关于默认参数,需要注意一点

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

如果更改B中的默认值:

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

使用重载,您只需要重新编译B


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

“我知道我可以用一个方法(使用默认值参数)编写整个过程”-我会在这个场景中这样做,就像我