今天的會議,Anders 的 session 座無虛席,Anders 回顧了一下C#的曆史,以及展望了未來,然後著重提了幾個特性。
C# 1.0, 大概98年11月份開始組件團隊,馬上就10年了。關鍵詞:Managed Code,Managed 程式碼
C# 2.0, 提出了,Generics
C# 3.0, 主要是Linq
那麼C# 4.0呢?
Anders 提到目前語言的幾個方向,或者是以後的趨勢
- Declarative,所謂聲明性語言,比如 Linq,他重點強調是關注做什麼,而不是怎麼做。或者類似SQL語言一眼
- Dynamic,動態語言,這個比如當前流行的Ruby,Python,動態語言有動態語言的優勢
- CoCurreny,並發,或者說並行計算。目前進入多核時代,PDC上Intel,AMD 也都有自己的工具讓你的C++程式來profile問題更好支援多核,以及編譯器的支援。
其中CoCurrent,CLR 4.0多了一個並行計算的類庫,也有PLinQ,比如PLinq.For等
動態語言,以前有IronPython,這個版本會有完整的Runtime支援
比如 Dynamic Typed Object、 Optional and Named Parameter,這個特性就是選擇性參數以及命名的參數,VB.NET 很早就有了,過了10年,C#才有。Anders開玩笑說,這就叫Co—Evolution,可以說互相學習吧,為了VB.NET會跟C#特性儘可能的一致。
然後就是COM Interop,所謂的NoPIA的問題,以前做Office應用的時候,一個小的C#應用,比如訪問Excel的Com 互操作,可能就要Reference一個1M多的Assembly。現在C#可以動態把用到的介面和類型,嵌入到Assembly中,這個成為Assembly Embedding,而對於多個版本的問題,比如一個介面,不同版本,只要GUID一樣,則可當作一個type,彼此可以互相CAST,只是啟動並執行時候會約束方法參數一致,所謂Type Safe。
然後開始示範Dynamic ,包含了Expression Tree,Dynamic Dispatching,Call Site Caching。
下面則是不同的Binder,比如對JS,Python,Ruby的Binder
一個Demo是關於Silverlight的,我們知道在Silverlight的C#代碼中,如果你要訪問JS的話,大多會用
HtmlWindow.Invoke(“Foo”,Parameters)
那麼現在改為
Dynamic win=HtmlWindow.AsDyanmic
可以直接Call
win.Foo(parameters) 啟動並執行時候,Runtime會解析和派遣到對應的方法。
這時候Foo是JAVA Script寫的一個方法,後來覺得還不過癮。能不能用C#來寫呢?
改為
private Foo()
{
Dynamic map=Window.New.Map();
map.Load(para)…
}
鼓掌。。。
然後示範了一下Python的整合
比如Define add(x,y):
return x+y;
dynamic foo=pyahoruntime.load(“your.py”)
foo.add(x,y),直接調用
當然Python本來就是動態語言,你可以add(1,2),也可以add(Datetime.Now, timespan)
然後著重講一下Dynamic,當然如果是Dynamic對於實值型別的話,其實沒有什麼花樣,在編譯的時候就已經知道類型。對於動態類型,runtime 在啟動並執行時候派遣到對應的對象,方法。
Dynamic對象,有一個IDynamicObject介面,主要包含了一些GetMember,Invoke的方法。
也可以在C#中自己定義個一個動態對象。
比如
Foo:IDynamicObject
{
SetMember()
GetMember()
}
然後dynamic foo=new Foo();
foo.X=Value
foo.Y=Value
就會調用我們定義的SetMember方法。
然後我們可以寫一個Generic的Helper方法。
比如
void DumpPrice(dynamic obj)
{
Console.Writeline(obj.Price + obj.Name)
}
不過是動態對象還是靜態對象,只要有Price和Name兩個member,都可以被DumpPrice方法調用
所謂的Dispatch可以到動態對象,也可以到靜態對象
接下來示範了選擇性參數以及命名方法。
現在你可以這樣定義方法了
SaveFIle(string filename, int fileSize=1204,encoding coding=null)
你調用的時候可以
直接Saveas(”foo.txt”)
也可以SaveAS(“foo.txt”,fileSize:2034)
還可以打亂順序,SaveAS(“foo.txt”, encoding:xyz, fileSize:2222)
又是鼓掌…
然後提了一下Co Contra Variance的問題。下面的代碼,在3.0是不可能編譯通過的。一個是Invariant問題一個是Contravariance問題
Code
delegate T Func1<out T>();
delegate void Action1<in T>(T a);
static void Main(string[] args)
{
Func1<Cat> cat = () => new Cat();
Func1<Animal> animal = cat;
Action1<Animal> act1 = (ani) => { Console.WriteLine(ani); };
Action1<Cat> cat1 = act1;
Console.WriteLine(animal());
cat1(new Cat());
}
IEnuamable<Object> 不等於IEnuamble<string>
多了一個IEnuamble<out T> 或者 <in T>
編譯的時候就可以更安全檢查
最後展望了更未來的版本
Anders說他很看好Meta Programming,可是目前的Compiler是個黑盒子,NativeC++寫的。開發人員不能控制Comipler任何的行為。
以後Compiler 會變成一個Service,可以在你編譯或者runtime的時候加入你自己的邏輯。
比如可以有一個Eval方法
CSharpEvaluator eval=new CSharpEvaluator();
eval.reference.add(“system”)
eval.eval(“for(int i=0;i<10;i++) Console.WriteLine(i)”)
則會執行你輸入的C#代碼,有了這個你就可以快速做一個C#解譯器,嘿嘿。不超過50行代碼,Anders就Show了一個
這是這次的主要內容,供大家參考