C#4.0

C#4.0

C#4.0增加了動態語言的特性,從裡面可以看到很多javascript、python這些動態語言的影子。雖然越來越偏離靜態語言的道路,但從另一個角度來說,這些特性也都是為了提高程式設計師的生產力。

基本介紹

  • 中文名:C#4.0
  • 特性動態語言
  • 作用:為了提高程式設計師的生產力
  • 概述:看到很多javascript、python
動態語言介紹,新特性,

動態語言介紹

C#4.0增加了動態語言的特性,從裡面可以看到很多javascript、python這些動態語言的影子。從另一個角度來說,這些特性也都是為了提高程式設計師的生產力。

新特性

Dynamically Typed Object
C#4.0加入了dynamic關鍵字,可以申明一個變數的static類型為dynamic。
在3.0及之前,如果你不知道一個變數的類型,而要去調用它的一個方法,一般會用到反射:
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add",BindingFlags.InvokeMethod, null,new object[] { 10, 20 });int sum = Convert.ToInt32(res);
有了dynamic,就可以把上面代碼簡化為:
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);
使用dynamic的好處在於,可以不去關心對象是來源於COM, IronPython, HTML DOM或者反射,只要知道有什麼方法可以調用就可以了,剩下的工作可以留給runtime。
dynamic也可以用在變數的傳遞中,runtime會自動選擇一個最匹配的overload方法。
這裡有一個demo:把一段javascript代碼拷到C#檔案中,將var改成dynamic,function改成void,再改一下構造函式的調用方式(new type()改為win.New.type()),去掉javascript中的win.前綴(因為這已經是C#的方法了),就可以直接運行了。
dynamic的實現是基於IDynamicObject接口和DynamicObject抽象類。而動態方法、屬性的調用都被轉為了GetMember、Invoke等方法的調用。
Named and optional parameters
帶有可選參數方法的聲明:
public StreamReader OpenTextFile(string path,Encoding encoding = null,bool detectEncoding = true,int bufferSize = 1024);
命名參數必須在最後使用:
OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096);
順序不限:
OpenTextFile(bufferSize: 4096, path: "foo.txt", detectEncoding: false);
Improved COM Interoperability
在C#中在調用COM對象如office對象時,經常需要寫一堆不必要的參數:
object fileName = "Test.docx";
object missing = System.Reflection.Missing.Value;
doc.SaveAs(ref fileName,ref missing, ref missing, ref missing,ref missing, ref missing, ref missing,ref missing, ref missing, ref missing,ref missing, ref missing, ref missing,ref missing, ref missing, ref missing);
4.0中就可以直接寫成:
doc.SaveAs("Test.docx");
Co- and Contra-Variance
在C#中,下面的類型轉換是非法的:
IList<string> strings = new List<string>();
IList<object> objects = strings;
因為你有可能會這樣做,而編譯器的靜態檢查無法查出錯誤:
objects[0] = 5;
string s = strings[0];
4.0中在聲明generic的Interface及Delegate時可以加in及out關鍵字,如:
public interface IEnumerable<out T> : IEnumerable{IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IEnumerator{bool MoveNext();T Current { get; }}
public interface IComparer<in T>{public int Compare(T left, T right);}
out關鍵字的意思是說IEnumerable<T>中T只會被用在輸出中,值不會被改變。這樣將IEnumerable<string>轉為IEnumerable<object>類型就是安全的。
in的意思正好相反,是說IComparer<T>中的T只會被用在輸入中,這樣就可以將IComparer<object>安全的轉為IComparer<string>類型。
前者被稱為Co-Variance, 後者就是Contra-Variance。
.Net4.0中使用out/in聲明的Interface:
System.Collections.Generic.IEnumerable<out T>System.Collections.Generic.IEnumerator<out T>System.Linq.IQueryable<out T>System.Collections.Generic.IComparer<in T>System.Collections.Generic.IEqualityComparer<in T>System.IComparable<in T>
Delegate:
System.Func<in T, …, out R>System.Action<in T, …>System.Predicate<in T>System.Comparison<in T>System.EventHandler<in T>
Compiler as a Service
4.0中增加了與編譯器相關的API,這樣就可以將字元串作為代碼動態編譯執行,跟javascript好像。
Video的最後,Anders做了一個很酷的demo,大概只用了二三十行代碼,就實現了在控制台中直接執行C#語句,定義並調用函式,動態創建windows form,添加button等功能,看起來完全不遜色於Python,Ruby之類語言的控制台。

相關詞條

熱門詞條

聯絡我們