一、可选参数:
调用方法时,常常给某个参数传送相同的值。例如,这可能是一个布尔值,以控制方法操作中的不重要部分:
public List<string> GetWords(
string sentence,bool capitalizeWords)
{
...
}
无论给capitalizeWords 参数传送什么值,这个方法都会返回一系列string 值,每个string 值都是输入句子中的一个单词。根据这个方法的使用方式,可能需要把返回的单词列表转换为大写(也许要格式化一个标题)。但在大多数情况下,并不需要这么做。所以大多数调用如下所示:
List<string> words = GetWords(sentence, false);
为了把这种方式变成“默认”方式,可以声明第二个方法,如下所示:
public List<string> GetWords(string sentence)
{
return GetWords(sentence, false);
}
这个方法调用第二个方法,并给capitalizeWords 传送值false。
这么做没有任何错误,但可以想象在使用更多的参数时,这种方式会非常复杂。
另一种方式是把capitalizeWords 参数变成可选参数。这需要在方法定义中将参数定义为可选参数,这需要提供一个默认值,如果没有提供值,就使用默认值,如下所示:
public List<string> GetWords(
string sentence,bool capitalizeWords = false)
{
...
}
如果以这种方式定义方法,就可以提供一个或两个参数,只有希望capitalizeWords 是true 时,才需要第二个参数。
其语法如下所示:
<parameterType> <parameterName> = <defaultValue>
注意:
1)给<defaultValue>用作默认值的内容有一些限制:默认值必须是字面值、常量值、新对象实例或者默认值类型值。
2)使用可选值时,它们必须位于方法的参数列表末尾。没有默认值的参数不能放在有默认值的参数后面。
3)可以使用多个默认值
二、命名参数:
使用可选参数时,可能会发现某个方法有几个可选参数,但您可能只想给第三个可选参数传送值。从上面的语法来看,如果不提供前两个可选参数的值,就无法给第三个可选参数传送值。
其语法如下:
MyMethod(
<param1Name>: <param1Value>,
...
<paramNName>: <paramNValue>);
在调用的时候使用。
参数的名称是在方法定义中使用的变量名。
只要命名参数存在,就可以用这种方式指定需要的任意多个参数,而且参数的顺序是任意的。命名参数也是可选的。
可以仅给方法调用中的某些参数使用命名参数。当方法签名中有多个可选参数和一些必选参数时,这是非常有用的。可以先指定必选参数,再指定命名的可选参数。
我们来看一个完整的栗子:
public static class WordProcessor
{
//可选参数,三个默认值
public static List<string> GetWords(
string sentence,
bool capitalizeWords = false,
bool reverseOrder = false,
bool reverseWords = false)
{
List<string> words = new List<string>(sentence.Split(' '));
if (capitalizeWords)
words = CapitalizeWords(words);
if (reverseOrder)
words = ReverseOrder(words);
if (reverseWords)
words = ReverseWords(words);
return words;
}
//第一个字母大写
private static List<string> CapitalizeWords(List<string> words)
{
List<string> capitalizedWords = new List<string>();
foreach (string word in words)
{
if (word.Length == 0)
continue;
if (word.Length == 1)
capitalizedWords.Add(word[0].ToString().ToUpper());
else
capitalizedWords.Add(word[0].ToString().ToUpper() +word.Substring(0,1));
}
return capitalizedWords;
}
//倒序
private static List<string> ReverseOrder(List<string> words)
{
List<string> reversedWords = new List<string>();
for (int wordIndex = words.Count - 1;wordIndex >= 0; wordIndex--)
reversedWords.Add(words[wordIndex]);
return reversedWords;
}
//单词倒序
private static List<string> ReverseWords(List<string> words)
{
List<string> reversedWords = new List<string>();
foreach (string word in words)
reversedWords.Add(ReverseWord(word));
return reversedWords;
}
private static string ReverseWord(string word)
{
StringBuilder sb = new StringBuilder();
for (int characterIndex = word.Length - 1;characterIndex >= 0; characterIndex--)
sb.Append(word[characterIndex]);
return sb.ToString();
}
}
static void Main(string[] args)
{
string sentence = "'twas brillig, and the slithy toves did gyre "+ "and gimble in the wabe:";
List<string> words;
//调用可选参数方法
words = WordProcessor.GetWords(sentence);
Console.WriteLine("Original sentence:");
foreach (string word in words)
{
Console.Write(word);
Console.Write(' ');
}
Console.WriteLine('\n');
//调用命名参数方法
//注意,所指定的两个参数的顺序与定义它们的顺序不同。
words = WordProcessor.GetWords(sentence,reverseWords: true,capitalizeWords: true);
Console.WriteLine("Capitalized sentence with reversed words:");
foreach (string word in words)
{
Console.Write(word);
Console.Write(' ');
}
Console.ReadKey();
}