C 中的語法糖

2021-06-18 21:34:32 字數 3307 閱讀 5380

-語法糖,意指那些沒有給計算機語言新增新功能,而只是對人類來說更「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(predicate

match)

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年的東西,這不剛學蠻 ...