C#語法糖大彙總

首先須要聲明的是「語法糖」這個詞絕非貶義詞,它能夠給我帶來方便,是一種便捷的寫法,編譯器會幫咱們作轉換;並且能夠提升開發編碼的效率,在性能上也不會帶來損失。這讓java開發人員羨慕不已,呵呵。java

 

1.  通過簡化的Propertysql

早些時候咱們這樣聲明Propertyc#

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.  通過兩次變異的委託寫法this

在.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.  集合類的聲明spa

以前咱們聲明一個List並給list賦初始值,必須得這麼寫:.net

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" ,
             Url= "http://yukaizhao.cnblogs.com/"
         };
     }

 

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中返回查詢數據時很好用。

若是你們還有更多的語法糖,歡迎分享。同時但願你們享受語法糖,由於他能夠給咱們帶來方便,請不要對它嗤之以鼻,也不必對它嗤之以鼻。

相關文章
相關標籤/搜索