C#4.0新特性之二:Named and Optional Parameters (1)

这个特性比较简单,依旧长话多说,只说重点。下面这个demo我们经常使用重载函数来处理问题的场景:

Code

 

在C#4.0时代给我们提供了两个新功能,命名参数(Named Parameters)和可选参数(Optional Parameters)。他们是两个完全独立的概念,只是经常一块使用。改写后的这个函数为:

Code

 

这样我们就可以用NBProcess(10)来调用这个函数,相当于NBProcess(10, 0f, "fanweixiao")的调用。

如果想省去第二个参数我们可以这样调用:NBProcess(10, p3:"FanWeixiao")。麻烦一点也可以写成NBProcess(p1:10,p3:"FanWeixiao")。甚至还可以把参数改变顺序NBProcess(p3:"FanWeixiao",p1:10)这样来调用。

对于构造函数和indexer也可以这么用。

对于有这样的参数的重载,究竟如何判断是调用哪个,逻辑也很简单:最相近原则。(applicable)

从参数是5来看,首先排除了M(string,int),因为它要求第一个参数是string类型的。M(int, string)是可以的因为string是可选参数,它和M(int)都比M(object)要好,object是“万恶之源”,比起object,5和int可是亲切多了。那么最后显而易见M(int)是最好的。

构造函数不同类型参数的位置和个数是决定其区分的关键,而c#4.0的这个特性把参数的名字放入规则中了,以后给参数起名也得正经点了:)。其实像python这样的动态语言,上面的功能都支持,还有一个更酷的“*参数”:

Code

当然我们也可以用param关键字做到这一点,但是确实还没有python那么酷,but,这已经够用了:)
posted @ 2008-10-31 03:27 new 维生素C.net() 阅读(1989) 评论(35) 编辑 收藏

 回复 引用 查看   
#1楼 2008-10-31 06:13 斯克迪亚      
这好像也是从函数式编程中借鉴来的,非常期待这种简单的适配器函数重载。
 回复 引用   
#2楼 2008-10-31 08:11 小灰1[未注册用户]
前两天我更学习了3.0的新特性。这么快又出4.0了。
我到底是整体学习还是工作呢?

 回复 引用 查看   
#3楼 2008-10-31 08:19 装配脑袋      
嗯。。和VB完全一样的特性。。
 回复 引用 查看   
#4楼 2008-10-31 08:22 装配脑袋      
其实,调用Attribute时就有命名参数的语法,但是这里居然没有采用相同的语法,真是太糟糕了。虽然我知道是运算符冲突的问题。可能是C#第一次遭遇语法危机。VB调用Attribute时的语法和命名参数传递的语法是完全一样的。

C#的Attribute语法
[SomeAttribute(10, named="value")]
而函数调用却变成了
SomeMethod(10, named:"value");


VB的Attribute语法
<SomeAttribute(10, named:="value")>
函数调用也是一样的语法
SomeMethod(10, named:="value")


 回复 引用 查看   
#5楼 2008-10-31 08:31 Q.Lee.lulu      
长话多说..............哈哈
 回复 引用 查看   
#6楼 2008-10-31 09:06 Caspar Jiong      
这功能不错
 回复 引用 查看   
#7楼 2008-10-31 09:07 Ivony...      
显然,运算符--引用--------------------------------------------------
装配脑袋: 其实,调用Attribute时就有命名参数的语法,但是这里居然没有采用相同的语法,真是太糟糕了。虽然我知道是运算符冲突的问题。可能是C#第一次遭遇语法危机。VB调用Attribute时的语法和命名参数传递的语法是完全一样的。


<p>
C#的Attribute语法


[SomeAttribute(10, named="value")]


而函数调用却变成了


SomeMethod(10, named:"value");

</p>


<p>
VB的Attribute语法


&lt;SomeAttribute(10, named:="value")&gt;


函数调用也是一样的语法


SomeMethod(10, named:="value")

</p>
--------------------------------------------------------


C#的Attribute语法是对属性赋值,所以实际上语义更明确。类似于C#3.0里面的
new SomeAttribute( 10 )
{
named = "value"
};

 回复 引用 查看   
#8楼 2008-10-31 09:08 有容乃大      
不错,总算看到了可选参数了。
-----------------------------------------
快速开发与工业化代码生成
http://www.cnblogs.com/mrhgw/archive/2008/10/09/1307247.html

 回复 引用 查看   
#9楼 2008-10-31 09:08 巫云      
python早就有了,呵呵。
 回复 引用 查看   
#10楼 2008-10-31 09:09 小庄      
C#?杂交水稻?呵呵
 回复 引用 查看   
#11楼 2008-10-31 09:14 Dirk(Cloud)      
学习~~~
 回复 引用 查看   
#12楼 2008-10-31 09:15 Dirk(Cloud)      
回答10楼,杂交水稻不好吗?你现在吃的也是,呵呵
早就希望有这样的功能。。终于在4.0中出现了。
很强大

 回复 引用   
#14楼 2008-10-31 09:26 Libra[未注册用户]
@巫云
应该说C++早就有了。(python比C++年轻许多吧)

 回复 引用 查看   
#15楼[楼主] 2008-10-31 09:32 new 维生素C.net()      
@装配脑袋
我也认为C#这一点做的不好,现在比较流行的动态语言在处理这类问题的时候也是用"=",而c#自己用了":". 赞成应该跟vb统一.

 回复 引用 查看   
#16楼 2008-10-31 09:36 暗香浮动      
C++的吧.
 回复 引用 查看   
#17楼 2008-10-31 09:50 生鱼片      
这个特性很实用,来的晚了一些
 回复 引用 查看   
#18楼 2008-10-31 09:56 装配脑袋      
属性参数支持否?如果不支持属性参数,在Office开发中仍然不会舒心的。
 回复 引用 查看   
#19楼 2008-10-31 10:00 悟不透      
再这么做下去,干脆把C#做成CScript算了。
微软滥用转基因技术。

 回复 引用 查看   
#20楼 2008-10-31 10:07 飘遥(周振兴)      
像PHP了,^_^
 回复 引用 查看   
#21楼 2008-10-31 10:14 Snowdream      
终于有这个功能了的~期待~
 回复 引用   
#22楼 2008-10-31 10:26 小灰1[未注册用户]
我喜欢C#的一个原因就是简洁

他这么搞下去,跟C++差不多了。

 回复 引用 查看   
#23楼 2008-10-31 10:38 Gray Zhang      
我感觉我回到了C++
 回复 引用 查看   
#24楼 2008-10-31 11:18 巡山小牛      
天哪,我刚开始学习3.0,MS真是个技术怪兽.....
 回复 引用 查看   
#25楼 2008-10-31 11:22 Anders Liu      
哎。。。当年Anders Heljsberg接受采访还大谈不使用变长参数列表、不使用可选参数的有点。。。现在……
 回复 引用 查看   
#26楼 2008-10-31 12:27 沐枫      
晕,连续看了两个特性,都是把vb.net的特性加进来了。
估计下一个特性应该是vb.net中的xml构造式吧。
vb可以这样定义一个xmldocument:

x = <books>
<book title="C#1.0" />
<book title="C#2.0" />
</books>



 回复 引用   
#27楼 2008-10-31 13:17 Jackson2008[未注册用户]
C# 中餐西餐,混合吃,呵呵!!
 回复 引用 查看   
#28楼 2008-10-31 13:30 Anders Cui      
@装配脑袋
"调用Attribute时就有命名参数的语法"
这个应该是命名属性的语法吧?

 回复 引用 查看   
#29楼 2008-10-31 13:55 中华小鹰      
命名参数?可选参数?
不喜欢这样的东西,会给版本控制带来很多很多的问题。
以后我修改一个方法的参数名咋办?
以后我修改参数的默认值咋办?
以前调用这个方法的方法还能正常工作吗?

 回复 引用 查看   
#30楼 2008-10-31 14:14 装配脑袋      
--引用--------------------------------------------------
Anders Cui: @装配脑袋
&quot;调用Attribute时就有命名参数的语法&quot;
这个应该是命名属性的语法吧?
--------------------------------------------------------
请看C#Spec……

 回复 引用 查看   
#31楼 2008-10-31 14:34 装配脑袋      
--引用--------------------------------------------------
中华小鹰: 命名参数?可选参数?
不喜欢这样的东西,会给版本控制带来很多很多的问题。
以后我修改一个方法的参数名咋办?
以后我修改参数的默认值咋办?
以前调用这个方法的方法还能正常工作吗?
--------------------------------------------------------

如果用这个方法的代码在另外一个程序集里,那么修改参数名是没有问题的,但是修改默认值将不会影响调用处。如果在同一个程序集,那么修改参数名就会直接编译错误。

我现在觉得,c#好复杂。
 回复 引用 查看   
#33楼 2008-10-31 16:45 Anders Cui      
@Windie Chai(笑煞天)
同感,过于追求“包办”了

 回复 引用 查看   
#34楼 2008-10-31 19:25 天方      
感觉最开始c#是一个简化的C++,现在却逐渐向c++看齐了,
哪一天泛型也能做到和c++一样强大就好了。

 回复 引用   
#35楼 2008-11-01 22:30 J[未注册用户]
@Libra
C++那叫默认参数,没有可选的特性。

C#这样整下去,还不如直接用Python呢!