PDC - C#4.0 以及未來

來源:互聯網
上載者:User

今天的會議,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了一個

這是這次的主要內容,供大家參考

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.