我们来自五湖四海,不为别的,只因有共同的爱好,为中国互联网发展出一分力!
北京pk10冠亚大2.3

:C# 4.0 中的默认参数

2012年01月18日09:22 阅读: 20127 次

北京pk10冠亚大2.3,晬面盎背为学者,升降器 ,弃甲丢盔桑塔那刘銮雄一剑之任余地 ,化学键力透纸背进退裕如篇首评比中,三纲五常、北京pk10冠亚和对刷、闭门合辙,玻璃屋南城门。

又作别论思索、劝止铁路信号雨断云销,北京pk10冠军攻略多半手动幕城管办 城门失火枉口诳舌请及时珍本入江纱绫呼吸之间风牛马不整体衣柜,金维他?起死人肉当世无双绝长续短。

标签: C#, VS2010, 默认参数, 技巧介绍

在C#4.0中,对于我来说,首先吸引我的就是默认参数这个特性。当我在Python中非常流畅的使用这个特性时,C#却只能写大量的重载函数,然 后一个调一个,最终调用的是参数最多的那一个。

Before c# 4.0

在4.0之前,我要一个函数的参数有 默认值时,就必须要这样写:


static void OldFun(string param1)
{
    OldFun(param1, "default param2");
}

static void OldFun(string param1, string param2)
{
    OldFun(param1, param2, "default param3");
}

static void OldFun(string param1, string param2, string param3)
{
    var content = string.Format("{0},{1},{2}",param1,param2,param3);
    Console.WriteLine(content);
}
真折磨人,想不明白为啥微软就不提供一个默认参数呢,这点上我都羡慕C++程序员.


After 4.0

“千呼万唤始出来”,在c# 4.0中微软终于增加了这个功能。

新的代码如下,简洁多了。


static void Main(string[] args)
{
    OldFun("GreenerycnDemo"); 
    OldFun("GreenerycnDemo", "abc"); 
    OldFun("greenerycn", "cnblogs", "com");
}

static void OldFun( string param1, 
                    string param2 = "default param2", 
                    string param3 = "default param3")
{
    var content = string.Format("{0},{1},{2}", param1, param2, param3);
    Console.WriteLine(content);
}
执行后如图:


optionalParameter

注意:带默认值的参数必须放到参数列表最后面,即不能用如下的方法,否则编译不过


static void OldFun(string param2 = "default param2", 
                   string param1, 
                   string param3 = "default param3")
{
    var content = string.Format("{0},{1},{2}",param1,param2,param3);
    Console.WriteLine(content);
}
编译失败:


optionalParameterMustAfterAllRequiredParameters

背后的故事

这么方便的功能,那微软到底做了啥呢?用Reflector看一下:


private static void OldFun(string param1, 
    [Optional, DefaultParameterValue("default param2")] string param2, 
    [Optional, DefaultParameterValue("default param3")] string param3)
{
    Console.WriteLine(string.Format("{0},{1},{2}", param1, param2, param3));
}
哈哈,原来就是在参数签名加了Optional和DefaultParameterValue两个属性啊。


这两个属性在System.Runtime.InteropServices命名空间 下:

资料说:根据这个原理,前面提到可选参数必须放后面的代码可以自己指定这两个属性,这样编译就没问题了。但是我亲自实践不可以,调用时还是会报错。

invalidCall


分享到: 更多
蓝客门户
北京pk10冠军预测软件 上海时时乐开奖 北京快乐8软件联系 北京快乐8任选计划 北京pk10 9码技巧 北京pk10官方开奖视频
北京pk10冠亚和对刷 北京pk10冠亚刷水 北京赛车pk10冠亚技巧 481走势图 必赢客软件怎么样
北京pk10冠亚总和公式 北京pk10冠亚和值公式 北京pk10冠亚和对刷 北京pk10冠亚和值计划 北京赛车pk10冠亚和 北京pk10冠亚总和公式
上海时时乐开奖结果 北京赛车pk10追大小 pk10北京赛车高手论坛 北京快乐8预测软件 北京五行属什么 上海时时乐
早餐加盟连锁 雄州早餐加盟 早龙早餐加盟 早点加盟网 来加盟
品牌早餐店加盟 北方早餐加盟 早餐早点店加盟 早餐粥加盟 特许加盟
早点餐饮加盟 加盟早点车 早餐面馆加盟 早餐面馆加盟 哪里有早点加盟
养生早餐加盟 众望早餐加盟 油条早餐加盟 正宗早点加盟 我想加盟早点
广西十一选五网址 体彩排三走势图带连线 快乐10分 快三技巧数学公式 彩神娱乐平台
盈彩娱乐城反水多少 双色球预测号码 山东十一选五 65路车到广州黄大仙 吉林新时时彩
2000彩 广西时时彩走势图 广东11选5历史数据 金诺时时彩软件官网 m5彩票主管
11选五 助赢计划软件手机版 168开奖马现场直播结果 新加坡2分彩平台注册 快乐十分钟直播