Csharp Syntactic sugar
C#语法糖(Csharp Syntactic sugar)大汇总
首先需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。这让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 { get; set; } |
当然他不会牺牲灵活性,我们可以单独给get或者set设定访问限制符,例如
|
1
|
public string MyName { get; protected 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 { 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", }; } |
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中返回查询数据时很好用。
如果大家还有更多的语法糖,欢迎分享。同时希望大家享受语法糖,因为他可以给我们带来方便,请不要对它嗤之以鼻,也没必要对它嗤之以鼻。
Csharp Syntactic sugar的更多相关文章
- C#语法糖(Csharp Syntactic sugar)大汇总
首先需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕 ...
- C#常用語法糖(Csharp Syntactic sugar)
首先需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕不已,呵呵. 1. ...
- C#语法糖(Csharp Syntactic sugar)
目录 一.C#语法糖大汇总 1. 经过简化的Property2. 经过两次变异的委托写法3. 集合类的声明4. 集合类各个项的操作5. using == try finally6. 可爱的var7. ...
- 语法糖(Syntactic sugar)
语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程)创造的一个词语,它意指那些没有给计算机语言添 ...
- scala tuple中的syntactic sugar
List[Tuple2[String, Int]] // Base List[(String, Int)] // Syntactic sugar List[Tuple3[String, Float, ...
- [Advanced Python] 13 - "Decorator": syntactic sugar
单独一章复习:Python 函数装饰器,廖雪峰讲装饰器 基本概念 函数作为变量 从函数中返回函数 子函数写在外面貌似也可以,可这样就少了“封装性”. def greet(): return " ...
- 介绍一点.NET反编译的知识
反编译是我们理解.NET内部实现的一种良好的手段. 程序编译时 Test.exe是IL代码.我们可以通过一些工具,来查看这些IL代码. 一模一样? 理论上来说,一模一样的反编译是不存在的.原因有以下3 ...
- Go 语言相关的优秀框架,库及软件列表
If you see a package or project here that is no longer maintained or is not a good fit, please submi ...
- Awesome Go精选的Go框架,库和软件的精选清单.A curated list of awesome Go frameworks, libraries and software
Awesome Go financial support to Awesome Go A curated list of awesome Go frameworks, libraries a ...
随机推荐
- zoj3791(An Easy Game) DP
意甲冠军:给定两个01弦s1,s2.每一个变化s1在m字 - 位.要求k制作步骤之后s1变s2有多少种方法. 解法:DP,关键是状态的设计.考虑还是唯一性和可传递性.dp[i][j]表示第i步后有j个 ...
- ANDROID定义自己的看法——onMeasure,MeasureSpec源代码 过程 思考具体解释
一个简短的引论: 在他们的定义view什么时候,其实很easy,只需要知道3: 1.測量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGrou ...
- 私人定制javascript事件处理机制(浅谈)
看到园子里关于事件监听发表的文章,我都有点不好意思写了.不过想想我的题目以私人定制作开头也就妥妥地写吧. 事件相关概念 1.事件类型 发生事件的字符串 有传统事件类型 比如表单.window事件等 D ...
- Python美女[从新手到高手]--阅读"见个面问题 HashMap 储存方法"联想
今伯乐在线 上看到一篇文章.一道面试题看 HashMap 的存储方式.也就是问: 在 HashMap 中存放的一系列键值对,当中键为某个我们自己定义的类型.放入 HashMap 后,我们在外部把某一个 ...
- Socket 学习(三).4 UDP 穿透 客户端与客户端连接
效果图: 使用方法: 先 修改WinClient\bin\Debug 下面的 ip.ini,写上 服务器 IP地址. 客户端 与 客户端 通讯 之前 ,点击发送打洞消息 按钮,然后过一会再发送消息 ...
- 开源 java CMS - FreeCMS2.2 模型管理
项目地址:http://www.freeteam.cn/ 模型管理 从FreeCMS 2.0開始支持 通过模型添加删除字段,调整后台功能;支持网站.栏目.信息等模型. 因为操作方法同样.本文档以网站模 ...
- C语言库函数大全及应用实例九
原文:C语言库函数大全及应用实例九 [编程资料]C语言库函数大全及应用实例九 函数名: mktemp 功 ...
- Android利用CountDownTimer类实现倒计时功能
public class MainActivity extends Activity { private MyCount mc; private TextView tv; @Override publ ...
- Java-DES算法加密解密工具类
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import ...
- selenium之多线程启动grid分布式测试框架封装(四)
九.工具类,启动所有远程服务的浏览器 在utils包中创建java类:LaunchAllRemoteBrowsers package com.lingfeng.utils; import java.n ...