读书人

【有稽之谈】C# 5.0 这个可以有,该如何

发布时间: 2012-02-20 21:18:25 作者: rapoo

【有稽之谈】C# 5.0 这个可以有
最近看了这篇文章:
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 existsstring! 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 ofif (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) 方法返回匿名类的强类型支持。。。

BTW: 翻译的不准确或者理解有错的请拍砖~

[解决办法]
我很笨,很守旧,呵呵
感觉程序员越来越懒,到了人人都可以编程时,我们就退体了,哈哈.


[解决办法]

能在现在基础上做些语法增强。。

我就感觉很牛B了。。


[解决办法]
看过,支持。
[解决办法]

探讨
有的时候,人懒有创造力

[解决办法]
呵呵,别YY了

在YY,一会firelong,indusl 就要蹦出来了
[解决办法]
探讨

呵呵,别YY了

在YY,一会firelong,indusl 就要蹦出来了

[解决办法]
强力支持+推荐...
[解决办法]
机器人大叔 翻译的很不错!
[解决办法]
这个真的可以有
[解决办法]
学习了。。。
[解决办法]
还没学到这个地步
[解决办法]
啥情况,一口气那么多人回帖。。。
[解决办法]
呵呵,不知道是否是机密,不敢乱说。

大概说下已经公开的部分:Csharp vNext 最大的改进是对动态语法的增强,异步编程/并行编程。还有就是语法树的支持(表达式树的升级)使得开发者可以动态产生代码,或者实现领域编程语言和 Meta Programming。
[解决办法]
微软把C#做得越来越傻瓜化了
[解决办法]
呵呵,有几个还是有可能可以实现的
[解决办法]
支持一下.
[解决办法]
顶一下哈
[解决办法]
傻瓜化??
[解决办法]
想着case 能用变量。
[解决办法]

[解决办法]
这上面的这些语法是假想出来的吧?
现在不能用的吧?
不然我会觉得方便很多的。。。
[解决办法]
要智能化 要能更接近人类思维和表达 这才叫人性化
[解决办法]
我觉得,那个反射类需要优化,因为方法太多太杂了。。。
很乱,用起来不方便,要得到类实例里面的东西还是很难,很复杂的。。。。
[解决办法]
如果反射做得智能化了,那么自己写个什么对象数据库映射就简单了。。。

而现在,很复杂。。。

比如:
Classobject obj= DB.Find<ClassName>(Classobject);


这样就可以接受任何类型而不用写一句SQL语句,
而且数据访问层永远(至少在相当长的一段时间内)都不要改了。。。
[解决办法]
已有的东西我还没研究透,
新东西只能知道和了解,
没时间深入啊!
不过,顶楼主!!!!
LZ V5
YY是前进的动力!!!
[解决办法]
顶一个
[解决办法]
探讨

微软把C#做得越来越傻瓜化了

[解决办法]
C#,好啊,学习学习
[解决办法]


呵呵 ~
[解决办法]
要是再优化下去,程序员这个岗位可能就要消失在历史中了。。。。。。。。
[解决办法]
null安全,这在目前简直是个陷阱。
[解决办法]
越看越感觉自己什么都不会
[解决办法]
学习了~
[解决办法]
学习了
[解决办法]
好程序
[解决办法]
期待更强大的泛型约束,非常有用。
[解决办法]
顶一个
[解决办法]
非常感谢。。学习了。。
[解决办法]
不希望有太多傻瓜化的语法
该自己判空还是得自己来
[解决办法]
你是搞不懂微软想什么的
[解决办法]
呵呵,来凑个热闹
[解决办法]
YY中,迫切希望C#5中会出现
[解决办法]
C# 5.0出来吗?
[解决办法]
学习了~
[解决办法]
纯属扯淡,无语
[解决办法]
人创造东西 就是为了偷懒..........人的惰性 激发了创造力...
[解决办法]
程序员还有用么?
[解决办法]
微软常做表面的文章占领市,如Windows脸越来越漂亮,Office也越来越方便,而现在语言也越来越多的糖...可是性能确不被重视.....
[解决办法]
还在用2.0 = =
[解决办法]
测试过哪些系统?.net4.0比.net2.0慢么?
[解决办法]
这些功能太YY了
[解决办法]
路过,学习了。。。
[解决办法]
挺好,学习了。
[解决办法]
学习了!不错
[解决办法]
支持。现在感觉有些语法的确用起来不太简洁。
[解决办法]
学习了~~~
[解决办法]
飘过~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[解决办法]
确实要学习学习,顶一下!
很有意思!
[解决办法]

[解决办法]
很好很强大,I like
[解决办法]
这个可以有!好强大
[解决办法]
Make attributes first class citizens by allowing any type of parameter type.


很原汁原味的语言
意思大致是,使得attributes成为类里面的头等公民(市民)允许任何类型的参数类型。
[解决办法]
先看看,貌似挺复杂
[解决办法]

探讨

微软把C#做得越来越傻瓜化了

[解决办法]
探讨

引用:

微软把C#做得越来越傻瓜化了

不好吗,促进生产力发展啊

[解决办法]
探讨

Make attributes first class citizens by allowing any type of parameter type.
很原汁原味的语言
意思大致是,使得attributes成为类里面的头等公民(市民)允许任何类型的参数类型。

[解决办法]
YY ING
[解决办法]
顶.......
[解决办法]
学习一下
[解决办法]
学习了!很强大!得支持!
[解决办法]
挺好!
[解决办法]
晕。。。。。。。
[解决办法]

[解决办法]
惊恐中····
[解决办法]
偶是来学习学习的
[解决办法]
超级期待c#5
[解决办法]
dingqi....
[解决办法]
有些还是忙好的想法
[解决办法]
探讨

学习了~

[解决办法]
刚接触4.0,过来支持一下!
[解决办法]
给力~~~~~~~~~~~太多花哨的东西,感觉只是让代码写起来方便,我觉得还不如花时间来解决是c#的不足
[解决办法]
我感觉这样一点都不好,我希望只是一点简单的语法,虽然需要多写几句,但是好懂,不希望看到很简练的语句,非常难懂的。。。所以。。。不支持lz,花哨只是无聊中的自慰。。
[解决办法]
这个什么时候可以有
[解决办法]
神州行,越来越好!!!
[解决办法]
围观一下
[解决办法]
刚接触的人,飘过~~~~~~~~~~~~~~

[解决办法]
神州行,越来越好!!!
[解决办法]
代码精简了不少啊
[解决办法]
见识了,未来会更美好。
[解决办法]
什么都可以有。
[解决办法]
今后将是人工智能的时代 只需要做少量的工作就能得到你想要的功能

读书人网 >C#

热点推荐