首先需要聲明的是“語法糖”這個詞絕非貶義詞,它可以給我帶來方便,是一種便捷的寫法,編譯器會幫我們做轉換;而且可以提高開發編碼的效率,在性能上也不會帶來損失。這讓java開發人員羨慕不已,呵呵。
1. 經過簡化的Property
早些時候我們這樣聲明Property
1
2
3
4
5
6
7
8
9
10
11
|
private
string _myName; public
string MyName { get
{ return
_myName; } set
{ _myName = value; } } |
千篇一律的這樣聲明,沒有多大意義,於是C#的設計人員將這個千篇一律的工作交給了編譯器幫我們做了,我們現在可以這樣聲明
1
|
public
string MyName { get ;
set ; } |
當然他不會犧牲靈活性,我們可以單獨給get或者set設定訪問限制符,例如
1
|
public
string MyName { get ;
protected
internal set ; } |
2. 經過兩次變異的委託寫法
在.net 1.1時我們不得不聲明方法後纔在委託中使用,在.net 2.0之後我們可以使用匿名委託,他不單可以簡化寫法,還可以在匿名委託中訪問範圍內的變量;再後來拉姆達表達式來了,寫法就更簡便了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class
MyClass { public
delegate void
DoSomething( int
a); //定義方法委託 private
void DoIt( int
a) { Console.WriteLine(a); } private
void HowtoDo(DoSomething doMethod, int
a) { doMethod(a); } public
static void
Main( string [] args) { MyClass mc =
new MyClass(); //調用定義的方法委託 mc.HowtoDo( new
DoSomething(mc.DoIt), 10); int
x = 10; //使用匿名委託 mc.HowtoDo( delegate ( int
a){ Console.WriteLine(a + x); },10); //使用lamda表達式 mc.HowtoDo(a=>Console.WriteLine(a+x),10); Console.ReadLine(); } } |
3. 集合類的聲明
之前我們聲明一個List並給list賦初始值,必須得這麼寫:
1
2
3
4
|
List< string > list =
new List< string >(); list.Add( "a一" ); list.Add( "b二" ); list.Add( "c三" ); |
現在不需要了,直接寫就可以了
1
2
3
|
List< string > list =
new List< string > { "def" , "OK" }; |
4. 集合類各個項的操作
我們爲了逐個處理集合中的項,需要這麼寫:
1
2
3
4
|
foreach
( string
item in list) { Console.WriteLine(item); } |
現在不需要了,這樣就可以了
1
|
list.ForEach(a => Console.WriteLine(a)); |
代碼是不是清爽了很多。
5. using == try finally
爲了在使用完畢時釋放資源,我們經常要用using,using實質上就是try fiannaly的一個語法糖而已。例如
1
2
3
4
5
6
7
8
9
|
StreamWriter sw =
null ; try { sw =
new StreamWriter( "d:\abc.txt" ); sw.WriteLine( "test" ); } finally
{ if (sw!=
null ) sw.Dispose(); } |
上面的代碼可以簡化爲:
1
2
3
|
using
( var sw =
new StreamWriter( "d:\abc.txt" )) { sw.WriteLine( "test" ); } |
6. 可愛的var
var的意義時不必寫聲明的類型,編譯器會根據後面對var的賦值判斷它的類型,var的類型一旦確認就不能再改變,它只能作爲局部變量使用,不能用做字段也不能用做參數聲明。
例如:
1
|
var
writer = new
StreamWriter(path); |
1
|
for ( var
i=0;i<100;i++){} |
7. 問號的演變
老掉牙的一個問號+冒號
1
2
|
var
b = 3; var
a = b > 9?b.ToString():”0”+b; |
新寶寶兩個問號 ??,它表示左邊的變量如果爲null則值爲右邊的變量,否則就是左邊的變量值
1
2
|
string
a = null ; var
b = a??””; |
8. 類型實例化的語法糖
1
2
3
4
5
6
7
8
|
public
class Abc { public
int ID { get ;
set ; } public
string Name {
get ; set ; } public
string Url {
get ; set ; } } |
我們沒有爲上面的類聲明構造函數,但是我們可以像下面的形式來實例化它
1
2
3
4
5
6
7
|
public
static void
Main( string [] args) { var
abc = new
Abc{ ID=1, Name= "yukaizhao" , }; } |
9. 傳說中的擴展方法
在c#3.5時引入了擴展方法,我們可以在不修改類源碼的情況下給類增加實例方法,這個很有意義。它的實質也是一種語法糖的實現
例如我們給String類擴展一個IsNumber的方法:
1
2
3
4
5
6
7
8
9
10
11
|
public
static class
StringExt { static
private Regex regexNumber =
new Regex( "\\d+" ); static
public bool
IsNumber( this
string input) { if
( string .IsNullOrEmpty(input)) { return
false ; } return
regexNumber.IsMatch(input); } } |
我們可以在String實例上調用這個方法了
1
2
|
var
abc = “123”; var
isNumber = abs.IsNumber(); |
10.使用匿名類
1
2
3
|
var
a = new { ID = 1,Name=”yukaizhao”,BlogUrl=”http: //www.cnblogs.com/yukaizhao/” }; |
匿名類在linq to sql或者entity framework中返回查詢數據時很好用。
如果大家還有更多的語法糖,歡迎分享。同時希望大家享受語法糖,因爲他可以給我們帶來方便,請不要對它嗤之以鼻,也沒必要對它嗤之以鼻。