在C#中执行重载函数的更好方法?

在C#中执行重载函数的更好方法?,c#,function,overloading,C#,Function,Overloading,我有很多函数,在这些函数中我获取信息并填充类或其他东西。不过,他们愿意接受不完整的信息,并经常使用默认值填充 这里有一个粗略的例子 string name; string address; string phonenum; void SaveClass(string a) { SaveClass(a, "UNSET", "UNSET"); } void SaveClass(string a, string b) { SaveClass(a, b, "UNSET"); } v

我有很多函数,在这些函数中我获取信息并填充类或其他东西。不过,他们愿意接受不完整的信息,并经常使用默认值填充

这里有一个粗略的例子

string name;
string address;
string phonenum;

void SaveClass(string a)
{
    SaveClass(a, "UNSET", "UNSET");
}

void SaveClass(string a, string b)
{
    SaveClass(a, b, "UNSET");
}

void SaveClass(string a, string b, string c)
{
    name = a;
    address = b;
    phonenum = c;
}
如果我能做这样的事情,那就太酷了

void SaveClass(string a, optional string b="UNSET", optional string c="UNSET")
{
    name = a;
    address = b;
    phonenum = c;
}
这样,我可以一次快速写出所有三个重载。有这样的吗

谢谢您的帮助。

从C#4开始,您可以使用可选参数来完成这项工作:

然后,在调用该方法时,可以指定命名参数:

或者只使用按顺序填充的位置参数:

SaveClass("Foo", "Some value for B");
即使不使用可选参数,也可以使用命名参数,如果在方法调用中有许多参数,并且不清楚哪个参数是哪个参数,那么命名参数确实会有所帮助

有一些限制:可选参数的默认值必须是常量,可选参数必须位于方法签名的末尾(除了
params
parameters),但这些限制都是有充分理由的


在寻找更多文档时需要注意的一点是,尽管这些特性通常被称为可选参数和命名参数,但许多文章(包括)都会讨论“可选参数”甚至“命名参数”。

您可以这样做。只需从参数中删除
可选部分

它们被称为可选参数。这里有一个MSDN链接:

您可以这样使用它们:

void MyFunc(string x, int y = 0)
{
    //do whatever
}
小提示:它是C#4或更高版本,所有可选值都必须是常量,因为编译器实际上是将它们烧录到编译后的代码中。这只是语法糖,真的

SaveClass("Foo", "Some value for B");
void MyFunc(string x, int y = 0)
{
    //do whatever
}