【IT168 技术文档】
1.命名和可选参数
Visual C# 2010引入了命名和可选参数,经常使用SQL Server编写存储过程的开发人员对此应该比较熟悉—命名参数和可选参数与存储过程的参数十分相似。
命名参数允许调用者通过提供参数的名称来为其赋值,这样参数的位置就不在重要了。可选参数允许在定义时为某些参数赋值,在调用时可以忽略这些“可选的”参数。命名参数和可选参数可以应用在方法、索引器、构造函数和委托。命名参数和可选参数与dynamic类型结合在一起使用,可以方便的访诸如Office自动化API之类的COM API。
(1)命名参数
命名参数的语法为:
参数名称1:参数值1,参数名称2:参数值2…
例如以下代码:
static void Main(string[] args)
{
CreateUser(password:"adminpassword",name:"admin");
}
static void CreateUser(string name, string password)
{
Console.WriteLine("name:{0},password:{1}", name, password);
}
{
CreateUser(password:"adminpassword",name:"admin");
}
static void CreateUser(string name, string password)
{
Console.WriteLine("name:{0},password:{1}", name, password);
}
可以看到由于在调用时使用了命名参数,参数的位置就不在重要了。
(2)可选参数
方法、构造函数、索引器和委托的定义可以指定其参数为必选的还是可选的,在调用时必须提供必选参数,但是可以省略可选参数。
还可以使用System.Runtime.InteropServices.OptionalAttribute特性类定义可选参数,该类从1.0时代就已经包含在基类库中了。
每一个可选参数的定义都包含默认值(默认值必须是常量),如果在调用时没有指定该参数,则使用默认值。例如以下代码:
static void Main(string[] args)
{
CreateUser("admin","adminpassword",50);
}
/// <summary>
/// 创建用户
/// </summary>
/// <param name="name">用户名称</param>
/// <param name="password">用户密码</param>
/// <param name="score">积分</param>
/// <param name="isLocked">是否锁定</param>
static void CreateUser(string name, string password,
int score=20,bool isLocked=false)
{
Console.WriteLine("name:{0},password:{1}", name, password);
}
{
CreateUser("admin","adminpassword",50);
}
/// <summary>
/// 创建用户
/// </summary>
/// <param name="name">用户名称</param>
/// <param name="password">用户密码</param>
/// <param name="score">积分</param>
/// <param name="isLocked">是否锁定</param>
static void CreateUser(string name, string password,
int score=20,bool isLocked=false)
{
Console.WriteLine("name:{0},password:{1}", name, password);
}
在所有必须参数后面定义可选参数,如果在调用时提供了某个可选参数的值,那么必须提供该可选参数之前所有可选参数的值(如果此参数之前有可选参数),而不允许使用逗号分隔的形式提供参数,即以下调用是错误的:
CreateUser("admin","adminpassword",,true);
而必须写成:
CreateUser("admin","adminpassword",20,true);
或者更好的解决办法是使用命名参数:
CreateUser("admin","adminpassword",isLocked:true);
而必须写成:
CreateUser("admin","adminpassword",20,true);
或者更好的解决办法是使用命名参数:
CreateUser("admin","adminpassword",isLocked:true);