深入C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)的詳細(xì)介紹
更新時(shí)間:2013年05月18日 11:11:10 作者:
本篇文章是對(duì)C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
1.dynamic ExpandoObject
熟悉js的朋友都知道js可以這么寫 :
var t = new Object();
t.Abc = ‘something';
t.Value = 243;
現(xiàn)在這個(gè)js動(dòng)態(tài)語(yǔ)言的特性,我們也可以在c#中使用了,前提是將一個(gè)變量聲明為ExpandoObject類型。如下例:
static void Main(string[] args)
{
dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = 10000;
Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);
Console.ReadLine();
}
C# 4.0中新增了一個(gè)命名空間System.Dynamic來(lái)實(shí)現(xiàn)對(duì)此應(yīng)用的支持,這種用法的意義何在,現(xiàn)在我還不太清楚,也是是c#向動(dòng)態(tài)語(yǔ)言過(guò)渡的一種試探吧。
2.泛型自動(dòng)轉(zhuǎn)換
在C#4.0之前下面的代碼是不可以編譯通過(guò)的
IEnumerable<object> objs = new List<string> {
"I'm 0","I'am 1","I'am 2"
};
但是在c#4.0中這種聲明是允許的,不過(guò)也僅限于泛型接口,泛型類型的類似做法是不允許的,如下代碼是有編譯錯(cuò)誤的
List<object> objList = new List<string> {
"I'am 0","I'am 1","I'am 2"
};
3.方法參數(shù)之可選參數(shù)
如下方法聲明的語(yǔ)法
static void DoSomething(int notOptionalArg,string arg1 = "default Arg1", string arg2 = "default arg2") {
Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2);
}
這個(gè)方法有三個(gè)參數(shù)第一個(gè)是必選參數(shù),第二個(gè)和第三個(gè)是可選參數(shù),他們都有一個(gè)默認(rèn)值。這種形式對(duì)固定參數(shù)的幾個(gè)方法重載很有用。
如下調(diào)用:
static void Main(string[] args)
{
DoSomething(1);
DoSomething(1, "葫蘆");
DoSomething(1, "葫蘆", "黃瓜");
Console.ReadLine();
}
也許你會(huì)想到,假如我有一個(gè)和可選參數(shù)方法不選某個(gè)參數(shù)相同的方法簽名的方法時(shí),c#會(huì)怎么處理呢,我們看下下面的代碼
static void DoSomething(int notOpArg, string arg)
{
Console.WriteLine("arg1 = {0}", arg);
}
我又重載了一個(gè)DoSomething這個(gè)方法有兩個(gè)參數(shù),但是沒(méi)有可選參數(shù),實(shí)驗(yàn)證明調(diào)用
DoSomething(1,”arg”)時(shí)會(huì)優(yōu)先執(zhí)行沒(méi)有可選參數(shù)的方法。
4.方法參數(shù)之命名參數(shù)
命名參數(shù)讓我們可以在調(diào)用方法時(shí)指定參數(shù)名字來(lái)給參數(shù)賦值,這種情況下可以忽略參數(shù)的順序。如下方法聲明:
static void DoSomething(int height, int width, string openerName, string scroll) {
Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll);
}
我們可以這樣來(lái)調(diào)用上面聲明的方法
static void Main(string[] args)
{
DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname");
Console.ReadLine();
}
很顯然的這是一個(gè)語(yǔ)法糖,但是在方法參數(shù)很多的情況下很有意義,可以增加代碼的可讀性。
熟悉js的朋友都知道js可以這么寫 :
復(fù)制代碼 代碼如下:
var t = new Object();
t.Abc = ‘something';
t.Value = 243;
現(xiàn)在這個(gè)js動(dòng)態(tài)語(yǔ)言的特性,我們也可以在c#中使用了,前提是將一個(gè)變量聲明為ExpandoObject類型。如下例:
復(fù)制代碼 代碼如下:
static void Main(string[] args)
{
dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = 10000;
Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);
Console.ReadLine();
}
C# 4.0中新增了一個(gè)命名空間System.Dynamic來(lái)實(shí)現(xiàn)對(duì)此應(yīng)用的支持,這種用法的意義何在,現(xiàn)在我還不太清楚,也是是c#向動(dòng)態(tài)語(yǔ)言過(guò)渡的一種試探吧。
2.泛型自動(dòng)轉(zhuǎn)換
在C#4.0之前下面的代碼是不可以編譯通過(guò)的
復(fù)制代碼 代碼如下:
IEnumerable<object> objs = new List<string> {
"I'm 0","I'am 1","I'am 2"
};
但是在c#4.0中這種聲明是允許的,不過(guò)也僅限于泛型接口,泛型類型的類似做法是不允許的,如下代碼是有編譯錯(cuò)誤的
復(fù)制代碼 代碼如下:
List<object> objList = new List<string> {
"I'am 0","I'am 1","I'am 2"
};
3.方法參數(shù)之可選參數(shù)
如下方法聲明的語(yǔ)法
復(fù)制代碼 代碼如下:
static void DoSomething(int notOptionalArg,string arg1 = "default Arg1", string arg2 = "default arg2") {
Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2);
}
這個(gè)方法有三個(gè)參數(shù)第一個(gè)是必選參數(shù),第二個(gè)和第三個(gè)是可選參數(shù),他們都有一個(gè)默認(rèn)值。這種形式對(duì)固定參數(shù)的幾個(gè)方法重載很有用。
如下調(diào)用:
復(fù)制代碼 代碼如下:
static void Main(string[] args)
{
DoSomething(1);
DoSomething(1, "葫蘆");
DoSomething(1, "葫蘆", "黃瓜");
Console.ReadLine();
}
也許你會(huì)想到,假如我有一個(gè)和可選參數(shù)方法不選某個(gè)參數(shù)相同的方法簽名的方法時(shí),c#會(huì)怎么處理呢,我們看下下面的代碼
復(fù)制代碼 代碼如下:
static void DoSomething(int notOpArg, string arg)
{
Console.WriteLine("arg1 = {0}", arg);
}
我又重載了一個(gè)DoSomething這個(gè)方法有兩個(gè)參數(shù),但是沒(méi)有可選參數(shù),實(shí)驗(yàn)證明調(diào)用
DoSomething(1,”arg”)時(shí)會(huì)優(yōu)先執(zhí)行沒(méi)有可選參數(shù)的方法。
4.方法參數(shù)之命名參數(shù)
命名參數(shù)讓我們可以在調(diào)用方法時(shí)指定參數(shù)名字來(lái)給參數(shù)賦值,這種情況下可以忽略參數(shù)的順序。如下方法聲明:
復(fù)制代碼 代碼如下:
static void DoSomething(int height, int width, string openerName, string scroll) {
Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll);
}
我們可以這樣來(lái)調(diào)用上面聲明的方法
復(fù)制代碼 代碼如下:
static void Main(string[] args)
{
DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname");
Console.ReadLine();
}
很顯然的這是一個(gè)語(yǔ)法糖,但是在方法參數(shù)很多的情況下很有意義,可以增加代碼的可讀性。
相關(guān)文章
在unity腳本中控制Inspector面板的參數(shù)操作
這篇文章主要介紹了在unity腳本中控制Inspector面板的參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(4)
這篇文章主要介紹了C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì),學(xué)習(xí)內(nèi)容是總結(jié)銷售信息的保存以及加載銷售信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-11-11C#/VB.NET 實(shí)現(xiàn)在PDF表格中添加條形碼
條碼的應(yīng)用已深入生活和工作的方方面面。在處理?xiàng)l碼時(shí),常需要和各種文檔格式相結(jié)合。本文,以操作PDF文件為例,介紹如何在編輯表格時(shí),向單元格中插入條形碼,需要的可以參考一下2022-06-06C# datatable 不能通過(guò)已刪除的行訪問(wèn)該行的信息處理方法
采用datatable.Rows[i].Delete()刪除行后再訪問(wèn)該表時(shí)出現(xiàn)出現(xiàn)“不能通過(guò)已刪除的行訪問(wèn)該行的信息”的錯(cuò)誤2012-11-11