可选参数与命名参数

来源:互联网 发布:apache ant 编辑:程序博客网 时间:2024/04/29 17:36

一、可选参数:

调用方法时,常常给某个参数传送相同的值。例如,这可能是一个布尔值,以控制方法操作中的不重要部分:

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();

}