《CLR Via C# 第3版》筆記之(十) - 可選參數(shù)和可變數(shù)量參數(shù)
C#中也可以像動態(tài)語言那樣,定義可選參數(shù)和可變數(shù)量參數(shù)。通過使用可選參數(shù)和可變數(shù)量參數(shù)可以構(gòu)建更加靈活的函數(shù)。
主要內(nèi)容:
- 可選參數(shù)
- 可變數(shù)量參數(shù)
1. 可選參數(shù)
可選參數(shù)即調(diào)用函數(shù)時(shí),傳遞參數(shù)的個(gè)數(shù)和順序和定義的不一致。
這樣不用重載,也可以實(shí)現(xiàn)類似重載的多個(gè)版本的函數(shù)定義。
示例代碼如下:
using System;
namespace cnblog_bowen
{
public class CLRviaCSharp_10
{
static void Main(string[] args)
{
/* 輸出結(jié)果
* i=1, s=Z, dt=00010101 00:00:00, g=00000000-0000-0000-0000-000000000000
*/
OptionalParams();
/* 輸出結(jié)果
* i=1, s=ABC, dt=00010101 00:00:00, g=00000000-0000-0000-0000-000000000000
*/
OptionalParams(1,"ABC");
/* 輸出結(jié)果 當(dāng)參數(shù)順序與函數(shù)定義的不一致時(shí),需要指定參數(shù),如下 dt:xxx
* i=1, s=Z, dt=20110704 15:08:46, g=00000000-0000-0000-0000-000000000000
*/
OptionalParams(1, dt:DateTime.Now);
/* 輸出結(jié)果 當(dāng)參數(shù)順序與函數(shù)定義的不一致時(shí),需要指定參數(shù),如下 g:xxx
* i=1, s=V, dt=00010101 00:00:00, g=eb7d3f73-88e4-4d2d-a5ea-9c0322e3e3bf
*/
OptionalParams(g:Guid.NewGuid(), s:"V");
Console.ReadKey(true);
}
private static void OptionalParams(Int32 i=1, String s="Z",
DateTime dt = default(DateTime), Guid g = new Guid())
{
Console.WriteLine("i={0}, s={1}, dt={2}, g={3}", i, s, dt.ToString("yyyyMMdd HH:mm:ss"), g.ToString());
}
}
}
在使用可選參數(shù)加強(qiáng)了C#的動態(tài)性的同時(shí),也需要關(guān)注可選參數(shù)的一些規(guī)則:
- 可以為方法,構(gòu)造器,有參屬性以及委托的參數(shù)指定默認(rèn)值
- 有默認(rèn)值的參數(shù)必須放在沒有默認(rèn)值的參數(shù)的后面
- 默認(rèn)值必須是編譯時(shí)能確認(rèn)的常量(如上代碼所示,可以使用default和new來定義默認(rèn)值)
- 用ref和out進(jìn)行標(biāo)示的參數(shù)不能設(shè)置默認(rèn)值
2. 可變數(shù)量參數(shù)
可變長參數(shù)其實(shí)與傳遞給函數(shù)一個(gè)數(shù)組是類似的。只不過用params標(biāo)記后,調(diào)用函數(shù)時(shí)更加自然一些。
示例如下:
using System;
namespace cnblog_bowen
{
public class CLRviaCSharp_10
{
static void Main(string[] args)
{
VarargsParams("price", 1, 2, 3, 4, 5);
Console.ReadKey(true);
}
private static void VarargsParams(string s, params Int32[] arr)
{
Int32 sum = 0;
foreach (var i in arr)
{
sum += i;
}
Console.WriteLine("sum type={0}, sum={1}", s, sum.ToString());
}
}
}
可變數(shù)量參數(shù)也有一些需要注意的規(guī)則:
- params關(guān)鍵字只能用于方法簽名的最后一個(gè)參數(shù)
- 調(diào)用params關(guān)鍵字標(biāo)記的方法和調(diào)用普通方法相比,有一些額外的性能損失。
對于以上的第2點(diǎn),原因如下:
以上面的代碼為例,調(diào)用函數(shù)VarargsParams("price", 1, 2, 3, 4, 5)時(shí),雖然參數(shù)是Int32型的,
但還是需要創(chuàng)建一個(gè)Int32的數(shù)組,需要在堆上分配內(nèi)存。
沒有調(diào)用這樣的函數(shù)快:private static void VarargsParams(string s, Int32 i1, Int32 i2, Int32 i3, Int32 i4, Int32 i5)
由于這個(gè)原因,System.String類的Concat方法定義以下幾種重載:
public static string Concat(string str0, string str1);
public static string Concat(string str0, string str1, string str2);
public static string Concat(string str0, string str1, string str2, string str3);
public static string Concat(params string[] values);

浙公網(wǎng)安備 33010602011771號