C#语法糖(Csharp Syntactic sugar)大汇总 经过简化的Property早些时候我们这样声明Property1234567891011privatestring_myName;publicstringMyName{get{return_myName; }set{ _myName value; }}千篇一律的这样声明没有多大意义于是C#的设计人员将这个千篇一律的工作交给了编译器帮我们做了我们现在可以这样声明1publicstringMyName {get;set; }当然他不会牺牲灵活性我们可以单独给get或者set设定访问限制符例如1publicstringMyName {get;protectedinternalset; }2 经过两次变异的委托写法在.net 1.1时我们不得不声明方法后才在委托中使用在.net 2.0之后我们可以使用匿名委托他不单可以简化写法还可以在匿名委托中访问范围内的变量再后来拉姆达表达式来了写法就更简便了。1234567891011121314151617181920212223242526272829classMyClass{publicdelegatevoidDoSomething(inta);//定义方法委托privatevoidDoIt(inta) {Console.WriteLine(a);}privatevoidHowtoDo(DoSomething doMethod,inta) {doMethod(a);}publicstaticvoidMain(string[] args) {MyClass mc newMyClass();//调用定义的方法委托mc.HowtoDo(newDoSomething(mc.DoIt), 10);intx 10;//使用匿名委托mc.HowtoDo(delegate(inta){Console.WriteLine(a x);},10);//使用lamda表达式mc.HowtoDo(aConsole.WriteLine(ax),10);Console.ReadLine();}}3 集合类的声明之前我们声明一个List并给list赋初始值必须得这么写1234Liststring list newListstring();list.Add(a一);list.Add(b二);list.Add(c三);现在不需要了直接写就可以了123Liststring list newListstring {def,OK};4 集合类各个项的操作我们为了逐个处理集合中的项需要这么写1234foreach(stringiteminlist){Console.WriteLine(item);}现在不需要了这样就可以了1list.ForEach(a Console.WriteLine(a));代码是不是清爽了很多。5 using try finally为了在使用完毕时释放资源我们经常要用usingusing实质上就是try fiannaly的一个语法糖而已。例如123456789StreamWriter sw null;try{sw newStreamWriter(d:\abc.txt);sw.WriteLine(test);}finally{if(sw!null) sw.Dispose();}上面的代码可以简化为123using(varsw newStreamWriter(d:\abc.txt)) {sw.WriteLine(test);}6 可爱的varvar的意义时不必写声明的类型编译器会根据后面对var的赋值判断它的类型var的类型一旦确认就不能再改变它只能作为局部变量使用不能用做字段也不能用做参数声明。例如1varwriter newStreamWriter(path);1for(vari0;i100;i){}7 问号的演变老掉牙的一个问号冒号12varb 3;vara b 9?b.ToString():”0”b;新宝宝两个问号 ??它表示左边的变量如果为null则值为右边的变量否则就是左边的变量值12stringa null;varb a??””;8 类型实例化的语法糖12345678publicclassAbc{publicintID {get;set; }publicstringName {get;set; }publicstringUrl {get;set; }}我们没有为上面的类声明构造函数但是我们可以像下面的形式来实例化它1234567publicstaticvoidMain(string[] args) {varabc newAbc{ID1,Nameyukaizhao,Urlhttp://yukaizhao.cnblogs.com/};}9 传说中的扩展方法在c#3.5时引入了扩展方法我们可以在不修改类源码的情况下给类增加实例方法这个很有意义。它的实质也是一种语法糖的实现例如我们给String类扩展一个IsNumber的方法1234567891011publicstaticclassStringExt {staticprivateRegex regexNumber newRegex(\\d);staticpublicboolIsNumber(thisstringinput){if(string.IsNullOrEmpty(input)){returnfalse;}returnregexNumber.IsMatch(input);}}我们可以在String实例上调用这个方法了12varabc “123”;varisNumber abs.IsNumber();10使用匿名类123vara new{ID 1,Name”yukaizhao”,BlogUrl”http://www.cnblogs.com/yukaizhao/”