老外暢想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 ?
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類型的自動裝箱,拆箱——看上去就像返回多值同樣。
 
C# code ?
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,甚至是表達式
C# code ?
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
 
C# code ?
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)
C# code ?
1
2
3
4
5
6
7
8
9
10
  
     switch  (aString) 
    
         case  .IsNullOrEmpty(): 
             ... 
         case  .Length > 100: 
             ... 
         case  .Contains( "foo" ): 
             ... 
     


4. Null 安全
(1) 不可爲空操做符
C# code ?
1
2
3
4
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 ?
1
DelegateType! DelegateVar;

(3) "?."類成員Null安全的操做符: 你能夠省掉大量的非空判斷
C# code ?
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
C# code ?
1
2
3
MyClass value =  null
int  something = value.x.y ??? 0;
//something is now 0 

(5) IfNull 和 IfNotNull 關鍵字,使得非空短路判斷更加緊湊
C# code ?
1
2
3
4
// instead of
if  (a !=  null  && a.SomeProperty !=  null   && a.SomeProperty.SomeField !=  null ). 
// do this:
IfNotNull(a.SomeProperty.SomeField)  


5. 更強大的泛型約束
(1) 算法類型的約束?(這個沒看懂...難道說是T必須都是數值類型?)
C# code ?
1
2
3
public  T Foo<T>(T blah) where T : number { 
   return  blah * blah; 

(2) 枚舉類型的約束(目前只支持約束到struct)
C# code ?
1
public  void  DoSomething<T>(T  enum ) where T : System.Enum { ... } 

(3) 操做符約束,即約束T必須都重載了指定的操做符
C# code ?
1
public  static  int  Sum<T>(IEnumerable<T> seq) where T :  operator (T=T+T){ .. } 

(4) 帶參數構造方法約束
C# code ?
1
where  new ( int string )

(5) 約束能夠調用某個靜態方法?(這個感受不靠譜,不如容許接口裏定義static方法)
C# code ?
1
2
3
4
public  T Create<T>() where T :  static  Create() 
      return  T.Create(); 

(6) 能夠約束代理
(7) 能夠區別class仍是interface
C# code ?
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) 初始值
C# code ?
1
public  string  Name {  get set ; } =  "some value"

(2) readonly聲明:只能在構造方法中初始化
C# code ?
1
public  int  SomeValue {  get private  readonly  set ; } 


7. Dynamic的擴展
(1) 更像javascript,使得不用反射就能得到後期綁定的特性
C# code ?
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) 匿名類的屬性是隻讀的,除非經過反射才能修改
但願能像下面:
C# code ?
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>(#) 聲明屬性是不可修改。
C# code ?
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. 對於遞歸的嵌套迭代子
更加簡潔有效的遞歸迭代
C# code ?
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 這真沒看懂)
C# code ?
1
2
[SomeCoolAttribute(s=>s.Foo)] 
public  string  MyProp {  get set ; }


C# code ?
1
11. Enum的擴展

(1) 增長  ToDictionary<Tk,Tv> 和 ToList 擴展方法
(2) 類型化的枚舉 (不靠譜,畢竟Enum是ValueType的)
C# code ?
1
2
3
4
5
Enum<String>  Options
     Option1 =  "xxx" 
     Option2 =  "yyy" 


12. Property Change Notification
把 INotifyPropertyChanged 接口實現做成語法糖了?
C# code ?
1
public  Notifyable< int > Foo {  get set ; } 


13. 靜態方法
(1) 靜態的擴展方法 (目前的擴展方法,做用於對象實例上)
(2) 靜態的抽象或者虛方法

14. Exception grouping
容許分組捕獲異常避免重複的邏輯處理
C# code ?
1
2
3
4
5
6
7
8
try 
catch  (ArgumentOutOfRangeException) 
catch  (ArgumentNullException) 
    // Catch a ArgumentOutOfRangeException or a ArgumentNullException 


15. CsharpRepl
容許C#編譯器使用一個默認的類,入口主方法以及默認的命名空間
C# code ?
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關鍵字的做用是隻當事件有訂閱者時才真正調用。
   
C# code ?
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) 方法返回匿名類的強類型支持。。。

 

http://bbs.csdn.net/topics/370033789
相關文章
相關標籤/搜索