【有稽之谈】C# 5.0 这个可以有

机器人 2011-06-25 11:10:36
加精
最近看了这篇文章:
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 操作符
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类型的自动装箱,拆箱——看上去就像返回多值一样。
   
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,甚至是表达式

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

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)
 
switch (aString)
{
case .IsNullOrEmpty():
...
case .Length > 100:
...
case .Contains("foo"):
...
}


4. Null 安全
(1) 不可为空操作符

Void DoX(MyClass! obj) { … }
// The following would make the compiler say:
// "Cannot convert string to string!, an explicit conversion exists
string! nonNullable = someFunctionThatReturnsAString();

(2) 返回值不可为空的代理,并支持编译检查
DelegateType! DelegateVar;

(3) "?."类成员Null安全的操作符: 你可以省掉大量的非空判断

// 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
MyClass value = null; 
int something = value.x.y ??? 0;
//something is now 0

(5) IfNull 和 IfNotNull 关键字,使得非空短路判断更加紧凑
// instead of
if (a != null && a.SomeProperty != null && a.SomeProperty.SomeField != null).
// do this:
IfNotNull(a.SomeProperty.SomeField)


5. 更强大的泛型约束
(1) 算法类型的约束?(这个没看懂...难道说是T必须都是数值类型?)
public T Foo<T>(T blah) where T : number { 
return blah * blah;
}

(2) 枚举类型的约束(目前只支持约束到struct)
public void DoSomething<T>(T enum) where T : System.Enum { ... } 

(3) 操作符约束,即约束T必须都重载了指定的操作符
public static int Sum<T>(IEnumerable<T> seq) where T : operator(T=T+T){ .. } 

(4) 带参数构造方法约束
where new(int, string)

(5) 约束可以调用某个静态方法?(这个感觉不靠谱,不如允许接口里定义static方法)
public T Create<T>() where T : static Create() 
{
return T.Create();
}

(6) 可以约束代理
(7) 可以区别class还是interface
Derive from T:
class Foo<T> : T where T : class
Constraint for interfaces:
class Foo<T> where T : interface


6. 自动属性的增强
(1) 初始值
public string Name { get; set; } = "some value"; 

(2) readonly声明:只能在构造方法中初始化
public int SomeValue { get; private readonly set; } 


7. Dynamic的扩展
(1) 更像javascript,使得不用反射就能获得后期绑定的特性
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) 匿名类的属性是只读的,除非通过反射才能修改
希望能像下面:
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>(#) 声明属性是不可修改。

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. 对于递归的嵌套迭代子
更加简洁有效的递归迭代
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 这真没看懂)
[SomeCoolAttribute(s=>s.Foo)] 
public string MyProp { get; set; }


11. Enum的扩展

(1) 增加 ToDictionary<Tk,Tv> 和 ToList 扩展方法
(2) 类型化的枚举 (不靠谱,毕竟Enum是ValueType的)
Enum<String>  Options
{
Option1 = "xxx"
Option2 = "yyy"
}


12. Property Change Notification
把 INotifyPropertyChanged 接口实现作成语法糖了?
public Notifyable<int> Foo { get; set; } 


13. 静态方法
(1) 静态的扩展方法 (目前的扩展方法,作用于对象实例上)
(2) 静态的抽象或者虚方法

14. Exception grouping
允许分组捕获异常避免重复的逻辑处理
try 
{
}
catch (ArgumentOutOfRangeException)
catch (ArgumentNullException)
{
// Catch a ArgumentOutOfRangeException or a ArgumentNullException
}


15. CsharpRepl
允许C#编译器使用一个默认的类,入口主方法以及默认的命名空间
// 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关键字的作用是只当事件有订阅者时才真正调用。
 // 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) 方法返回匿名类的强类型支持。。。

BTW: 翻译的不准确或者理解有错的请拍砖~
...全文
6599 164 打赏 收藏 转发到动态 举报
写回复
用AI写文章
164 条回复
切换为时间正序
请发表友善的回复…
发表回复
不喜欢等待 2011-09-16
  • 打赏
  • 举报
回复
你开发的?????
zhl198118_001 2011-08-12
  • 打赏
  • 举报
回复
WCF 顶,,
a89871618 2011-07-29
  • 打赏
  • 举报
回复
ddddddddddddddddddddddddddddddddddddddddd
言多必失 2011-07-26
  • 打赏
  • 举报
回复
现在面临一个问题,学会2.0,发现3.0语言很好,有学习下,也正在学习,现在4.0也出来了。还没有来的急学习,大家讨论5.0的,想想以后的学生更加的痛苦啊。老是更不上步伐,要是2002年开始学习C#就好了。
meng_qing_shan 2011-07-07
  • 打赏
  • 举报
回复
呵呵 很多都么接触过
太原经纬 2011-07-07
  • 打赏
  • 举报
回复
期待了 以后开发 会变得 更加有乐趣
LandWalkers 2011-07-07
  • 打赏
  • 举报
回复
支持人工呼喊功能。电脑上插个麦克风,把程序的需求读一遍,敲个回车,不到一会儿,C#5.0自动生成代码,编译成功!
fenix124 2011-07-07
  • 打赏
  • 举报
回复
没啥使用价值,个人感觉。我是为了混点可用分的
kyeon 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 108 楼 cosmo_sei 的回复:]
越来越像艺术品。
[/Quote]

+1 可以发到微软论坛
yo010yo 2011-07-06
  • 打赏
  • 举报
回复
IfNull,IfNotNull
还是这个不错。。
  • 打赏
  • 举报
回复
这些想法确实蛮好的
三七 2011-07-06
  • 打赏
  • 举报
回复
都有亮点 忙不过来拉 楼主多给点分 没分拉
姓张名超 2011-07-06
  • 打赏
  • 举报
回复
有创新是好的
realzsy 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 89 楼 visionsky1986 的回复:]

给力~~~~~~~~~~~太多花哨的东西,感觉只是让代码写起来方便,我觉得还不如花时间来解决是c#的不足
[/Quote]

C#只是门语言,唯一需要改进的地方就是语法和方便编写。。。。。。显然你说的东西是.Net Framework需要改进的.....然而基本每个版本C#更新.Net也会同时更新的。。。。麻烦你再换个理由先
不喜欢等待 2011-07-04
  • 打赏
  • 举报
回复
用C# 3.0做的东西 2.0一样可以实现 只是方便编写
感觉这几年更新太快了 都有点感觉自己跟不上了
sunchengbo2007 2011-07-02
  • 打赏
  • 举报
回复
这个真可以有,期待~~~~~~
土著巫师 2011-07-02
  • 打赏
  • 举报
回复
娘西屁,再发一个贴,被删贴居然又出来了!
土著巫师 2011-07-02
  • 打赏
  • 举报
回复
娘西屁,居然删老子的贴。
土著巫师 2011-07-02
  • 打赏
  • 举报
回复
C#迟早要挂掉,原因很简单:越来越杂,想把天下各类语言的程序员都变成C#程序员,而这是不可能的!语言是用来解决问题、减少程序员负担的,不是用来讨好所有人的!
dzpzds 2011-07-02
  • 打赏
  • 举报
回复
等待ms的x.0的时候就是全民编程。
促进生产力这确实是真的。
加载更多回复(139)

111,077

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧