-語法糖,意指那些沒有給計算機語言新增新功能,而只是對人類來說更「sweet」的語法,意在使得程式設計風格更易讀。c#2.0,3.0發布的新特性,除了泛型不是語法糖,其他所有的新特性幾乎都是語法糖。
-但初學者往往因為不了解這些語法糖,從而在閱讀**的時候,難以理解其真正的運作方式。最著名的莫過於lamda表示式
,第一次看到它,很多人都會頂個大問號把。。。
-文章前面會伴隨一些讓人看著想吐槽的**,請大家自行河蟹。然後我們會介紹一些語法糖來潤色一下,方便初學者們知道這些語法糖的原始意義。
我們來做乙個list類的練習。我會寫乙個很蛋疼的例子(盡量不用語法糖,當然這很難避免)。首先我定義了乙個學生類
public class student
} private string name;
public string name }
public student(string num, string name)
public override string tostring()
}
現在練習下list的findall()方法,它的宣告如下
public t findall(predicatematch)
findall方法把predicate
作為引數,predicate
是乙個委託,它引用乙個謂詞方法-返回布林值的方法。如果謂詞返回true,表示有乙個匹配。
所以我寫了乙個findstudent類來定義謂詞。這個方法用要搜尋的學生的學號來初始化,findpredicate()接收乙個student物件,比較student物件的學號與建構函式中設定的學號,返回true or false。
public class findstudent //修正於2010/4/20 感謝 terry_huang和 jack afa指正
public bool findpredicate(student student)
}
最後在乙個控制台程式裡搜尋名字叫john的學生。
class program
}}
有沒有人看到這已經扛不住了呢,特別是對findstudent類和findall的冗長的用法?
下面我們來一點一點的潤色把。
甜死你1號-
自動屬性:
只需在定義乙個類時指定屬性名,c#3.0編譯器將自動實現相應的內部的private變數,並自動生成set訪問器和get訪問器。
甜死你2號-
物件初始值設定項:
在自動屬性的前提下,在建立物件時可以對任何可訪問的屬性或字段賦值,而不需要顯示的呼叫建構函式。
基於這兩個特性,我們來修改一下student類:
public class student
public string name
public override string tostring()
}
自動屬性會自動生成私有變數,不需要顯示的宣告,並且可以直接通過物件初始值設定項對可訪問的屬性和字段賦值,建構函式也不是必須的。呃,是不是清爽多了。
甜死你3號-匿名方法 :
我們之前必須首先宣告方法後才能在委託中使用,c#2.0引入匿名方法,可以delegate的形式以一種「內聯」的方式來編寫方法**,將**直接與委託例項相關聯,從而使得委託例項化的工作更加直觀和方便。
有些時候我們需要臨時儲存一些運算的中間結果,我們常常會去宣告乙個新的型別,以方便儲存這些中間結果。表面上 看起來這很正常,而細想之後就會發現,這個新型別只服務於這個函式,其它地方都不會再使用它了,就為這乙個函式而去定義乙個新的型別,確實有些麻煩,比如findstudent類。
有了匿名方法,findstudent類已經沒有存在的意義了(大快人心?),因為自動屬性的關係,我們可以直接訪問屬性,並且用匿名方法來代替謂詞。
插播廣告:
甜死你4號-
集合初始值設定項
:我們除了可以像初始化陣列一樣,初始化物件之外,同樣對於集合也可以不用再重複的add來增加集合項了,我們來看新的main函式:
static void main(string args)
,//使用物件初始值設定項初始化物件,代替建構函式
new student(),
new student()
};//使用集合初始值設定項初始化集合,不用重複呼叫add方法
foreach (var student in students.findall(delegate(student student) ))//使用匿名方法完成findstudent類的功能
console.readkey();
}
是不是看著順眼多了。不過foreach這句還是有點不順眼。腫麼辦,我們只好開大招了。
甜死你終結者號-lamda表示式:
它是公升級版的匿名方法,其作用是簡化匿名方法的寫法。寫法(形參列表)=>
拿delegate(student student) 這個匿名方法為例,我們的引數就只有student乙個,形參我們就使用s代替。
lamda表示式就是 s=>s.name=="john
"。順便我們用一下list的foreach方法。
又一條廣告:
甜死你路人號-匿名型別:
使用var關鍵字來進行型別宣告,而不需要顯示的宣告型別,具體的型別將由編譯器來推斷。
最終的main函式就是:
static void main(string args)
,//使用物件初始值設定項初始化物件,代替建構函式
new student(),
new student()
};//使用集合初始值設定項初始化集合,不用重複呼叫add方法
var john = students.findall(s => s.name == "john");//使用var宣告匿名型別,其實john是個listjohn.foreach(j => console.writeline(j));//使用lamda表示式
console.readkey();
}
這樣的**看著就很舒服了。
當然語法糖還有很多,如文章開頭所說,c#的新特性大多是語法糖。當然還有一些其他的語法糖,比如三元運算子test?expression1:expression2就有乙個語法糖,寫作
expression1??expression2 2選1,expression1為null則執行expression2。反之執行expression1。
C 中 (問號)相關語法糖
c 中與 問號有關的語法糖大概有這幾個 在文章 c 中 問號 中已經有詳細說明。總結來看,除了?這個三元 運算子 表示式外,都是和是否空有關。但文章中對?未做更多描述,所以在這裡做個補充。看看下面的栗子 string arr null console.writeline arr 0 上面 將報錯 u...
Python中語法糖及帶參語法糖
在python中,符號常被稱作語法糖 裝飾器 在某函式定義時,用以包裝該函式,以達到擷取,控制該函式的目的。def d f print d.k f 此處保留了傳進來的原函式 f def f x return k x 2 return f 此處不能寫成f x f是函式控制代碼,如果帶 則呼叫,這裡只返...
Objective C中的語法糖
xcode 4.4中llvm compiler 4.0 引入的新特性 2012年wwdc發布的東西 到這小菜本人就有柳暗花明又一村的感覺啦 就可以好好的偷一下懶啦 於是系統的總結了一下引入的新的特性,話不多說,coder說話哪能少的了code呢!ludashi 走起 雖然是12年的東西,這不剛學蠻 ...