我正在使用自己的命令行参数解析器,在阅读了几十篇关于方法重载的文章后,我仍然不确定我是否正确行事。
我是否通过这种方式从重载方法中获益?我知道我可以通过分支在一个方法(使用默认值参数)中编写整个事物,但我现在正在尝试重载,我想知道是否继续这条路径。
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;
}
}
答案 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。
这是因为对于默认参数,在编译时编译器会插入默认值。