老外畅想C# 5.0这个可以有
老外大胆的YY了一下,感觉挺有意思转发过来。
回顾C#发展的历史,C#1.0模仿了Java,并保留了C/C++的一些特性如struct,新学者很容易上手;
C#2.0加入了泛型,匿名方法,yield关键字(为啥VB.NET到现在还没有yield?);
C#3.0加入了一堆语法糖,lambda,linq的加入,让C#变得更加优雅和灵活;
C#4.0增加了动态语言的特性,另外加入的TPL(并行开发库),PLinq等降低现存并发模型的复杂性也是相当的给力。
C#5.0???? 还会有什么奇思妙想?
1. in 和 between 操作符
|
1
2
3
|
if (x in (1, 2, 3)) if (x in 1:5)if (x between(1,5)) |
- 学python的,更加简洁自然的表达式。
2. 数据结构的增强
(1) 一些BCL(base class library)的Collection类型都变成泛型集合
比如:ControlCollection, XmlAttributeCollection, SqlErrorCollection, StringCollection
变成:Collection<Control>, Collection<XmlAttribute>,Collection<SqlError> 等
这使得遍历这种集合的时候,可以直接用 foreach(var x in ...) 目前虽然实现了迭代,但需要类型声明
(2) Tuple类型的自动装箱,拆箱——看上去就像返回多值一样。
|
1
2
3
4
5
6
7
8
9
|
public Tuple<string, int, double> ReturnMyTuple() { return "Hello World!", 42, 4.2; } // elsewhere: item1 is a string, item2 is an int, item3 is a double. var item1, item2, item3 = ReturnMyTuple(); |
(3) yield foreach (详见后面的嵌套迭代子)
3. switch 语法增强
(1) 智能推测case表达式:比如当switch变量是integer时,允许list,range,甚至是表达式
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
switch (anInt) { case 1, 2: Console.WriteLine("1 or 2"); break; case 3..9: Console.WriteLine("3 to 9"); break; case >= 10: Console.WriteLine("10 or higher"); break; default: ... } |
(2) 支持更多的类型,同时支持case中使用list
|
1
2
3
4
5
6
7
8
9
10
11
|
switch (aString) { case "one", "two": Console.WriteLine("1 or 2"); break; case "three": Console.WriteLine("3"); break; default: ... } |
(3) 允许在switch语句块中,省略对象访问成员(类似VB.NET的With...End With)
|
1
2
3
4
5
6
7
8
9
10
|
switch (aString) { case .IsNullOrEmpty(): ... case .Length > 100: ... case .Contains("foo"): ... } |
4. Null 安全
(1) 不可为空操作符
|
1
2
3
4
|
Void DoX(MyClass! obj) { … }// The following would make the compiler say: // "Cannot convert string to string!, an explicit conversion existsstring! nonNullable = someFunctionThatReturnsAString(); |
(2) 返回值不可为空的代理,并支持编译检查
|
1
|
DelegateType! DelegateVar; |
(3) "?."类成员Null安全的操作符: 你可以省掉大量的非空判断
|
1
2
3
4
5
6
7
8
9
10
|
// Instead of doing:var obj = Foo(); Bar value = null; if(obj.Bar != null && obj.Bar.Something != null) { value = obj.Bar.Something.DoSomething(); } //You can do this with Groovy's null safe member operator ?.var obj = Foo(); var value = obj?.Bar?.Something?.DoSomething(); |
(4) "???" 空对象链判断结合操作符:从顶级对象判断是否为null
就像 ?(a.B.C) 如果a==null则返回null
|
1
2
3
|
MyClass value = null; int something = value.x.y ??? 0;//something is now 0 |
(5) IfNull 和 IfNotNull 关键字,使得非空短路判断更加紧凑
|
1
2
3
4
|
// instead ofif (a != null && a.SomeProperty != null && a.SomeProperty.SomeField != null). // do this:IfNotNull(a.SomeProperty.SomeField) |
5. 更强大的泛型约束
(1) 算法类型的约束?(这个没看懂...难道说是T必须都是数值类型?)
|
1
2
3
|
public T Foo<T>(T blah) where T : number { return blah * blah; } |
(2) 枚举类型的约束(目前只支持约束到struct)
|
1
|
public void DoSomething<T>(T enum) where T : System.Enum { ... } |
(3) 操作符约束,即约束T必须都重载了指定的操作符
|
1
|
public static int Sum<T>(IEnumerable<T> seq) where T : operator(T=T+T){ .. } |
(4) 带参数构造方法约束
|
1
|
where new(int, string) |
(5) 约束可以调用某个静态方法?(这个感觉不靠谱,不如允许接口里定义static方法)
|
1
2
3
4
|
public T Create<T>() where T : static Create() { return T.Create(); } |
(6) 可以约束代理
(7) 可以区别class还是interface
|
1
2
3
4
|
Derive from T:class Foo<T> : T where T : class Constraint for interfaces:class Foo<T> where T : interface |
6. 自动属性的增强
(1) 初始值
|
1
|
public string Name { get; set; } = "some value"; |
(2) readonly声明:只能在构造方法中初始化
|
1
|
public int SomeValue { get; private readonly set; } |
7. Dynamic的扩展
(1) 更像javascript,使得不用反射就能获得后期绑定的特性
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Currently, this would take:var obj = new Foo(); object temp = obj .GetType() .GetProperty(aVariable) .GetValue(obj, null); int value = (int)temp .GetType() .GetMethod("Method") .Invoke(temp, null); What we want:dynamic obj = new Foo(); int value = obj[aVariable].Method(); |
(2) 匿名类的属性是只读的,除非通过反射才能修改
希望能像下面:
|
1
2
3
4
5
6
7
8
9
|
var obj = new dynamic { Foo = 1, Bar = "string" }; obj.Foo = 2; obj.NewProperty = Something(); obj["Bar"] = "a new value"; |
8. 不可变类型
现在只有一个办法封装一个不可变属性(这个不可变还指对属性的公开类成员也不可修改)
比如:使用 ReadOnlyCollection<T> 或者自己包装 ICollection<T> 或者使用 Tuple。
就像 Nullable<T>(?) 一样声明 Immutable<T>(#) 声明属性是不可修改。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Foo { public int ID { get; set; } public string Name { get; set; } } .. private Foo# _member; public Foo# Something { get { return _member; } } |
注意:Foo类型的公开成员ID和Name是可以Set的,但Foo#声明时,就不可以对ID,Name进行修改,这是最终目的。
9. 对于递归的嵌套迭代子
更加简洁有效的递归迭代
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public override IEnumerable<int> Foo() { yield return 1; yield return 2; foreach(var i in base.Foo()) yield i; } //allowing me to write:public override IEnumerable<int> Foo() { yield return 1; yield return 2; yield foreach base.Foo(); } |
* 这里原文直接用 yield base.Foo(); 后面回复有人指出有歧义,我也觉得用yield foreach好理解
10. 特性的增强
(1) lambda表达式可用于特性的参数
(2) 支持泛型的特性
(3) Make attributes first class citizens by allowing any type of parameter type.
(T___T 这真没看懂)
|
1
2
|
[SomeCoolAttribute(s=>s.Foo)] public string MyProp { get; set; } |
|
1
|
11. Enum的扩展 |
(1) 增加 ToDictionary<Tk,Tv> 和 ToList 扩展方法
(2) 类型化的枚举 (不靠谱,毕竟Enum是ValueType的)
|
1
2
3
4
5
|
Enum<String> Options{ Option1 = "xxx" Option2 = "yyy" } |
12. Property Change Notification
把 INotifyPropertyChanged 接口实现作成语法糖了?
|
1
|
public Notifyable<int> Foo { get; set; } |
13. 静态方法
(1) 静态的扩展方法 (目前的扩展方法,作用于对象实例上)
(2) 静态的抽象或者虚方法
14. Exception grouping
允许分组捕获异常避免重复的逻辑处理
|
1
2
3
4
5
6
7
8
|
try { } catch (ArgumentOutOfRangeException) catch (ArgumentNullException) { // Catch a ArgumentOutOfRangeException or a ArgumentNullException } |
15. CsharpRepl
允许C#编译器使用一个默认的类,入口主方法以及默认的命名空间
|
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
30
31
|
// Instead of:using System; class Program { static void Main(string[] args) { Console.WriteLine(fact(10)); Console.ReadLine(); } static int fact(int n) { if (n == 0) return 1; else return n * fact(n - 1); } } // Use this:static int fact(int n) { if (n == 0) return 1; else return n * fact(n - 1); } Console.WriteLine(fact(10)); Console.ReadLine(); |
16. 事件
使用一个 Fire 关键字来触发事件,Fire关键字的作用是只当事件有订阅者时才真正调用。
|
1
2
3
4
5
6
7
8
|
// Instead of: // copy ref to delegate for thread safety var evt = this.ApplicationTextUpdated; if (evt != null) evt(this, new EventArgs<string>(applicationText)); // do this Fire(this.ApplicationTextUpdated(this, new EventArgs<string>(applicationText)); |
17. OOP的增强
(1) 鸭子类型
(2) Tuple MustDispose
(3) Binding Contract - 指定源属性和对象属性。(不知道是不是指 ":=:")
(4) Typedef 预定义 (C++有)
(5) methodof/propertyof
(6) Roles -- 或者叫做"traits"而它不是指多重继承
比如:一个人他可能是“演员”也可能是“爸爸”在不同场景下有不同的角色
(7) make void first class (不懂T_T)
(8) 方法返回匿名类的强类型支持。。。
老外畅想C# 5.0这个可以有的更多相关文章
- MARKDOWN--介绍http://www.jianshu.com/p/q81RER
简 注册登录 添加关注 作者 简书2013.04.22 22:02* 写了267022字,被8398人关注,获得了9900个喜欢 献给写作者的 Markdown 新手指南 字数1600 阅 ...
- 工作记录--使用FFmpeg将一个视频文件中音频合成到另一个视频中
由于工作需要,临时被老大吩咐去研究一个FFmpeg工具,通过linux命令行去将一个视频中的音频提取出来并合成到另一个视频中,最终的效果是要保证2个视频中的音频都在一个视频中播放. 但是本人对FFmp ...
- ZAM 3D 制作简单的3D字幕 流程(二)
原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...
- ZAM 3D 制作3D动画字幕 用于Xaml导出
原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...
- 微信小程序省市区选择器对接数据库
前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...
- osg编译日志
1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...
- mono3.2和monodevelop4.0在ubuntu12.04上两天的苦战
首先第一步是设置ubuntu server 12.04版更新源,推荐中科大的比较快:deb http://debian.ustc.edu.cn/ubuntu/ precise main multive ...
- EntityFramework 7.0之初探【基于VS 2015】(十)
前言 本篇作为EF 7.0的开篇也是Entity Framework目前系列末篇,因为关于EF 7.0学习资料实在是太少,我都是参考老外的资料花费了不少时间去研究去尝试同时也失败多次,个人觉得那是值得 ...
- Disruptor-net 3.3.0
Disruptor 介绍 Disruptor 是LMX开源出来的java编写的一个并发消息处理器,在队列中一边生产者放入消息,另外一边消费者并行取出处理,其核心是根据现代CPU硬件缓存特点发明不同于通 ...
随机推荐
- How do I create zip file in Servlet for download?
原文链接:https://kodejava.org/how-do-i-create-zip-file-in-servlet-for-download/ The example below is a s ...
- Flash Builder 4.6配置ASDoc
ASDoc是Adobe自带的文档生成工具.可以生成类似JavaDoc格式的文档. 关于ASDoc详情参见官方文档: http://help.adobe.com/zh_CN/flex/using/WSd ...
- (五)java进制
进制 整数的表示 十进制: 0-9, 满10进1 八进制: 0-7, 满8进1,以0开头 每三位表示一位,三位数中最大的是111,111是7,7是八进制中最大的基数 十六进制:0-15,满 ...
- win7C盘不够用怎么办
Windows 7 是由微软公司(Microsoft)开发的操作系统,核心版本号为Windows NT 6.1.Windows 7 可供家庭及商业工作环境.笔记本电脑.平板电脑.多媒体中心等使用. 工 ...
- 《DSP using MATLAB》示例Example7.23
代码: wp = 0.2*pi; ws = 0.3*pi; Rp = 0.25; As = 50; [delta1, delta2] = db2delta(Rp, As); [N, f, m, wei ...
- C# null和" "的区别
String str1 = null; str引用为空 String str2 = ""; str引用一个空串 也就是null没有分配空间,""分 ...
- 圆方树总结 [uoj30]Tourists
圆方树总结 所谓圆方树就是把一张图变成一棵树. 怎么变啊qaq 这里盗一张图 简单来说就是给每一个点双新建一个点,然后连向这个点双中的每一个点.特殊的,把两个点互相连通的也视作一个点双. 我们把原来就 ...
- android通过查询电话号码获取联系人信息
// 取得Intent中的頭像 ivShowImage = (ImageView) findViewById(R.id.call_log_detail_contact_img); //通话电话号码获取 ...
- (转)Android 50道面试题总结(大家看看吧)
1. 方法重载与覆盖的区别?(Overload与Override的区别)2. String 和StringBuffer的区别3. 字符串“abcde”通过写一个函数不让调用第三方的字符串,实现一个字符 ...
- ReactJS开发环境搭建与相关工具介绍
现在Web开发的技术几年前相比可谓变化之大.各种各样的框架,各种各样的工具,让Web开发效率更高,开发出来的效果更好.同时带来的是开发环境的复杂度相比以前是成倍的增加.ReatJS框架是现在比较流行的 ...