首先須要聲明的是「語法糖」這個詞絕非貶義詞,它能夠給我帶來方便,是一種便捷的寫法,編譯器會幫咱們作轉換;並且能夠提升開發編碼的效率,在性能上也不會帶來損失。這讓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中返回查詢數據時很好用。
若是你們還有更多的語法糖,歡迎分享。同時但願你們享受語法糖,由於他能夠給咱們帶來方便,請不要對它嗤之以鼻,也不必對它嗤之以鼻。