C# 可選參數(shù)
調(diào)用方法時(shí),常給某個(gè)參數(shù)傳入相同的值。例如,這可能是一個(gè)布爾值,以控制方法操作中的不重要部分。具體而言,考慮下面的方法定義:
public List<string> GetWords(string sentence, bool capitalizeWords)
{
...
}
無(wú)論給capitalizeWonis參數(shù)傳入什么值,這個(gè)方法都會(huì)返回一系列string值,每個(gè)string值都是輸入句子中的一個(gè)單詞。根據(jù)這個(gè)方法的使用方式,可能需要把返回的單詞列表轉(zhuǎn)換為大寫(xiě)(也許要格式化一個(gè)標(biāo)題)。但大多數(shù)情況下并不需要這么做,所以大多數(shù)調(diào)用如下所示:
List<string> words = GetWords(sentence, false);
為了將這種方式變成“默認(rèn)”方式,可以聲明第二個(gè)方法,如下所示:
public List<string> GetWords{string sentence) => GetWords(sentence, false);
這個(gè)方法調(diào)用第二個(gè)方法,并給capitalizeWords傳入值false。
這么做沒(méi)有任何錯(cuò)誤,但可以想象在使用更多的參數(shù)時(shí),這種方式會(huì)非常復(fù)雜。
另一種方式是把capitalizeWoids參數(shù)變成可選參數(shù)。這需要在方法定義中為參數(shù)提供一個(gè)默認(rèn)值,使其成為可選參數(shù),如果調(diào)用此方法時(shí)沒(méi)有為該參數(shù)提供值,就使用默認(rèn)值,如下所示:
public List<string> GetWords (string sentence, bool capitalizeWords = false)
{
...
}
如果以這種方式定義方法,就可以提供一個(gè)或兩個(gè)參數(shù),只有希望capitalizeWords是true時(shí),才需要第二個(gè)參數(shù)。
1.可選參數(shù)的值
為方法定義可選參數(shù)的語(yǔ)法如下所示:
<parameterType> <parameterName> = <defaultValue>
對(duì)于<defcUltVah^>的默認(rèn)值,存在一些限制。默認(rèn)值必須是字面值、常量值或者默認(rèn)值類(lèi)型值。因此不會(huì)編譯下面的代碼:
public bool CapitalizationDefault;
public List<string> GetWords(string sentence,
bool capitalizeWords = CapitalxzationDofault)
{
...
}
為使上述代碼可以工作,CapitalizationDefiiult值必須定義為常量:
public const bool CapitalizationDefault = false;
這樣做是否有意義取決于具體情形,大多數(shù)情況下,最好提供一個(gè)字面值,就像上一節(jié)那樣。
2.Optional 特性
除了前面小節(jié)中描述的語(yǔ)法,還可以使用Optional特性定義可選參數(shù),如下所示:
[Optional] <parameterType> <parameterName>
此特性包含在System.Runtime.InteropServices名稱(chēng)空間中。注意,如果使用這種語(yǔ)法,就無(wú)法為參數(shù)提供默認(rèn)值。
3.可選參數(shù)的順序
使用可選值時(shí),它們必須位于方法的參數(shù)列表末尾。沒(méi)有默認(rèn)值的參數(shù)不釋放在有默認(rèn)值的參數(shù)后面。因此下面的代碼是非法的:
public List<string> GetWords(bool capitalizeWords = false, string sentence)
{
...
}
其中,sentence是必選參數(shù),因此必須放在可選參數(shù)capitalizedWords的前面。
點(diǎn)擊加載更多評(píng)論>>