在可选参数中,设计一个方法的参数时,可以为部分或全部参数分配默认值。在调用这些方法代码可以选择不指定部分实参,接受默认值。还可以在调用方法时,还可以通过指定参数名称的方式为其传递实参。如下实例:
static void OptionalParameters(int x, int y = 10, int z = 20)
{
Console.WriteLine("x={0} y={1} z={2}",x,y,z);
}
OptionalParameters(1, 2, 3); OptionalParameters(1, 2); OptionalParameters(1);
以上的例子可以很清楚的看到其用法,int y=10和int z=20这两个参数就是可选参数。可选参数的使用中,如果调用时省略了一个参数,C#编译器会自动嵌入参数的默认值。向方法传递实参时,编译器按从左向右的顺序对实参进行求值。使用已命名的参数传递实参时,编译器仍然按照从左到右的顺序对实参进行求值。
(2).基本原则:
可选参数包含一些规范,具体的一些要求如下:
(a).所有可选参数必须出现在必备参数之后,参数数组(使用params修饰符声明)除外,但他们必须出现在参数列表的最后,在他们之前是可选参数。
(b).参数数组不能声明为可选的,如果调用者没有指定值,将使用空数组代替。
(c).可选参数不能使用ref和out修饰符。
(d).可选参数可以为任何类型,但对于指定的默认值却有一些限制,那就是默认值必须为常量(数字或字符串字面量、null、const成员、枚举成员、default(T)操作符)。
(e).指定的值会隐式转换为参数类型,但是这种转换不能是用户定义的。
(f).可以为方法、构造器、有参属性的参数指定默认值,还可以为属于委托定一部分的参数指定默认值。
(g).C#不允许省略逗号之间的实参。
在使用可选参数时,对于引用类型使用null来做默认值,如果参数类型是值类型,只需要使用相应的可空值类型作为默认值。
(3).代码示例:
/// <summary>
/// 提取异常及其内部异常堆栈跟踪
/// </summary>
/// <param name="exception">提取的例外</param>
/// <param name="lastStackTrace">最后提取的堆栈跟踪(对于递归), String.Empty or null</param>
/// <param name="exCount">提取的堆栈数(对于递归)</param>
/// <returns>Syste.String</returns>
public static string ExtractAllStackTrace(this Exception exception, string lastStackTrace = null, int exCount = 1)
{
while (true)
{
var ex = exception;
const string entryFormat = "#{0}: {1}rn{2}";
lastStackTrace = lastStackTrace ?? string.Empty;
lastStackTrace += string.Format(entryFormat, exCount, ex.Message, ex.StackTrace);
if (exception.Data.Count > 0)
{
lastStackTrace += "rn Data: ";
lastStackTrace = exception.Data.Cast<DictionaryEntry>().Aggregate(lastStackTrace, (current, entry) => current + $"rnt{entry.Key}: {exception.Data[entry.Key]}");
}
//递归添加内部异常
if ((ex = ex.InnerException) == null) return lastStackTrace;
exception = ex;
lastStackTrace = $"{lastStackTrace}rnrn";
exCount = ++exCount;
}
}








