程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#語法糖,

C#語法糖,

編輯:C#入門知識

C#語法糖,


首先需要聲明的是“語法糖”這個詞絕非貶義詞,它可以給我帶來方便,是一種便捷的寫法,編譯器會幫我們做轉換;而且可以提高開發編碼的效率,在性能上也不會帶來損失。這讓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 { getset; }

當然他不會犧牲靈活性,我們可以單獨給get或者set設定訪問限制符,例如

? 1 public string MyName { getprotected 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 { getset; }       public string Name { getset; }       public string Url { getset; } }

我們沒有為上面的類聲明構造函數,但是我們可以像下面的形式來實例化它

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

如果大家還有更多的語法糖,歡迎分享。同時希望大家享受語法糖,因為他可以給我們帶來方便,請不要對它嗤之以鼻,也沒必要對它嗤之以鼻。

轉載自:http://www.timetowhere.com/post/grammar_sugar.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved