C# 4.0新特性之命名参数,默认参数
2009-10-14 21:57
218 查看
命名参数和默认参数都是很简单但是很实用的功能,可谓是千呼万唤始出来,在C#4.0里终于见到它们的身影。先看看命名参数的例子:
static void Main(string[] args)
{
GetData(useCache: true);
}
GetData(useCache: true)相当于GetData(true)。相较以前的写法,命名参数可以大大提高代码的可读性,读代码的人可以清晰地知道这个bool参数指的是是否使用cache。(再此之前我很不喜欢定义接口的时候使用bool型的参数,就因为调用它的代码可读性很差)
因为被调用方法通过名字得到参数,因此顺序是无关的,也就是说当用命名参数的时候,调用的顺序和定义的顺序可以不一致,比如这个例子:
static void Main(string[] args)
{
GetData(useCache: true, name: "anders");
}
private static int GetData(string name, bool useCache)
{
return 0;
}
再看看默认参数,和C++的语法一样,用=value来表示默认参数:
private static int GetData(string name, bool useCache = true)
{
return 0;
}
写到这里我不由得想到了那个经典的C++题目:当一个虚拟函数有默认参数,被一个基类的指针调用时,使用的参数是?用C#的表述就是下面这段代码:
class Program
{
public static void Main()
{
Base obj = new MyClass();
Console.WriteLine(obj.GetName());
Console.WriteLine(((MyClass)obj).GetName());
MyClass myObj = new MyClass();
Console.WriteLine(myObj.GetName());
}
}
class Base
{
public virtual string GetName(string baseName = "base")
{
return baseName;
}
}
class MyClass : Base
{
public override string GetName(string baseName = "myClass")
{
return baseName;
}
}
有趣的是,虽然实现上和C++全然不同,两者的行为是完全一样的:既谁调用,用谁的参数。如果是用Base调用,虽然对象是MyClass类型,执行的也是MyClass.GetName(), 但默认参数使用的是Base.GetName()的。这是因为C#的实现是通过给参数加属性,而属性这种东西是相对“静态”的,不会被virtual掉,那么也就自然是谁调用,就用谁的属性了。
static void Main(string[] args)
{
GetData(useCache: true);
}
GetData(useCache: true)相当于GetData(true)。相较以前的写法,命名参数可以大大提高代码的可读性,读代码的人可以清晰地知道这个bool参数指的是是否使用cache。(再此之前我很不喜欢定义接口的时候使用bool型的参数,就因为调用它的代码可读性很差)
因为被调用方法通过名字得到参数,因此顺序是无关的,也就是说当用命名参数的时候,调用的顺序和定义的顺序可以不一致,比如这个例子:
static void Main(string[] args)
{
GetData(useCache: true, name: "anders");
}
private static int GetData(string name, bool useCache)
{
return 0;
}
再看看默认参数,和C++的语法一样,用=value来表示默认参数:
private static int GetData(string name, bool useCache = true)
{
return 0;
}
写到这里我不由得想到了那个经典的C++题目:当一个虚拟函数有默认参数,被一个基类的指针调用时,使用的参数是?用C#的表述就是下面这段代码:
class Program
{
public static void Main()
{
Base obj = new MyClass();
Console.WriteLine(obj.GetName());
Console.WriteLine(((MyClass)obj).GetName());
MyClass myObj = new MyClass();
Console.WriteLine(myObj.GetName());
}
}
class Base
{
public virtual string GetName(string baseName = "base")
{
return baseName;
}
}
class MyClass : Base
{
public override string GetName(string baseName = "myClass")
{
return baseName;
}
}
有趣的是,虽然实现上和C++全然不同,两者的行为是完全一样的:既谁调用,用谁的参数。如果是用Base调用,虽然对象是MyClass类型,执行的也是MyClass.GetName(), 但默认参数使用的是Base.GetName()的。这是因为C#的实现是通过给参数加属性,而属性这种东西是相对“静态”的,不会被virtual掉,那么也就自然是谁调用,就用谁的属性了。
相关文章推荐
- 深入C# 4.0 新特性dynamic、可选参数、命名参数的详细介绍
- C#方法笔记一:C#4.0新特性:命名参数和可选参数
- 深入C# 4.0 新特性dynamic、可选参数、命名参数的详细介绍
- 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数, 动态绑定(dynamic), 泛型协变和逆变, CountdownEvent, Barrier
- C# 4.0 新特性dynamic、可选参数、命名参数等
- 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数, 动态绑定(dynamic), 泛型协变和逆变, CountdownEvent, Barrier
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C#4.0新特性:可选参数,命名参数,Dynamic
- 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C# 4.0 新特性dynamic、可选参数、命名参数等 分类: .NET 2013-07-26 11:15 414人阅读 评论(0) 收藏
- 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数, 动态绑定(dynamic), 泛型协变和逆变, CountdownEvent, Barrier
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C# 4.0 特性: Named & Optional Parameters(可选和命名参数)
- C# 4.0 新特性dynamic、可选参数、命名参数等
- [c#美味] c#4中默认参数和命名参数后的函数重载
- C# 4.0命名参数和可选参数