转自:http://topic.csdn.net/u/20110625/11/216f0320-56b4-4e1f-89d9-ce8708112c3b.html
最近看了这篇文章:
C# 5.0 - not quite there yet!
老外大胆的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 操作符
-
C# code
-
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类型的自动装箱,拆箱——看上去就像返回多值一样。
-
C# code
-
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,甚至是表达式
-
C# code
-
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
-
C# code
-
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)
-
C# code
-
switch
(aString) {
case
.IsNullOrEmpty(): ...
case
.Length
>
100
: ...
case
.Contains(
"
foo
"
): ... }
4. Null 安全
(1) 不可为空操作符
-
C# code
-
Void DoX(MyClass
!
obj) { … }
//
The following would make the compiler say:
//
"Cannot convert string to string!, an explicit conversion exists
string
!
nonNullable
=
someFunctionThatReturnsAString();
(2) 返回值不可为空的代理,并支持编译检查
-
C# code
-
DelegateType
!
DelegateVar;
(3) "?."类成员Null安全的操作符: 你可以省掉大量的非空判断
-
C# code
-
//
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
-
C# code
-
MyClass value
=
null
;
int
something
=
value.x.y
???
0
;
//
something is now 0
(5) IfNull 和 IfNotNull 关键字,使得非空短路判断更加紧凑
-
C# code
-
//
instead of
if
(a
!=
null
&&
a.SomeProperty
!=
null
&&
a.SomeProperty.SomeField
!=
null
).
//
do this:
IfNotNull(a.SomeProperty.SomeField)
5. 更强大的泛型约束
(1) 算法类型的约束?(这个没看懂...难道说是T必须都是数值类型?)
-
C# code
-
public
T Foo
<
T
>
(T blah)
where
T : number {
return
blah
*
blah; }
(2) 枚举类型的约束(目前只支持约束到struct)
-
C# code
-
public
void
DoSomething
<
T
>
(T
enum
)
where
T : System.Enum { ... }
(3) 操作符约束,即约束T必须都重载了指定的操作符
-
C# code
-
public
static
int
Sum
<
T
>
(IEnumerable
<
T
>
seq)
where
T :
operator
(T
=
T
+
T){ .. }
(4) 带参数构造方法约束
-
C# code
-
where
new
(
int
,
string
)
(5) 约束可以调用某个静态方法?(这个感觉不靠谱,不如允许接口里定义static方法)
-
C# code
-
public
T Create
<
T
>
()
where
T :
static
Create() {
return
T.Create(); }
(6) 可以约束代理
(7) 可以区别class还是interface
-
C# code
-
Derive
from
T:
class
Foo
<
T
>
: T
where
T :
class
Constraint
for
interfaces:
class
Foo
<
T
>
where
T :
interface
6. 自动属性的增强
(1) 初始值
-
C# code
-
public
string
Name {
get
;
set
; }
=
"
some value
"
;
(2) readonly声明:只能在构造方法中初始化
-
C# code
-
public
int
SomeValue {
get
;
private
readonly
set
; }
7. Dynamic的扩展
(1) 更像javascript,使得不用反射就能获得后期绑定的特性
-
C# code
-
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) 匿名类的属性是只读的,除非通过反射才能修改
希望能像下面:
-
C# code
-
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>(#) 声明属性是不可修改。
-
C# code
-
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. 对于递归的嵌套迭代子
更加简洁有效的递归迭代
-
C# code
-
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 这真没看懂)
-
C# code
-
[SomeCoolAttribute(s
=>
s.Foo)]
public
string
MyProp {
get
;
set
; }
-
C# code
-
11
. Enum的扩展
(1) 增加 ToDictionary<Tk,Tv> 和 ToList 扩展方法
(2) 类型化的枚举 (不靠谱,毕竟Enum是ValueType的)
-
C# code
-
Enum
<
String
>
Options { Option1
=
"
xxx
"
Option2
=
"
yyy
"
}
12. Property Change Notification
把 INotifyPropertyChanged 接口实现作成语法糖了?
-
C# code
-
public
Notifyable
<
int
>
Foo {
get
;
set
; }
13. 静态方法
(1) 静态的扩展方法 (目前的扩展方法,作用于对象实例上)
(2) 静态的抽象或者虚方法
14. Exception grouping
允许分组捕获异常避免重复的逻辑处理
-
C# code
-
try
{ }
catch
(ArgumentOutOfRangeException)
catch
(ArgumentNullException) {
//
Catch a ArgumentOutOfRangeException or a ArgumentNullException
}
15. CsharpRepl
允许C#编译器使用一个默认的类,入口主方法以及默认的命名空间
-
C# code
-
//
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关键字的作用是只当事件有订阅者时才真正调用。
-
C# code
-
//
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) 方法返回匿名类的强类型支持。。。