成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#歷史回顧及C# 4.0新特性一覽

開發 后端
本文對C#歷史做了一番簡單的回顧,并介紹了幾個C# 4.0的新特性。C#4.0增加了動態語言的特性,從里面可以看到很多javascript、python這些動態語言的影子。

C#歷史回顧

回顧C#發展的歷史,C# 1.0完全是模仿Java,并保留了C/C++的一些特性如struct,新學者很容易上手;C# 2.0加入了泛型,也與Java1.5的泛型如出一轍;C# 3.0加入了一堆語法糖,并在沒有修改CLR的情況下引入了Linq,簡直是神來之筆,雖然很多項目出于各種各樣如性能之類的原因沒有采用,但非常適合小型程序的快速開發,減輕了程序員的工作量,也提高了代碼的可讀性;C# 4.0增加了動態語言的特性,從里面可以看到很多javascript、python這些動態語言的影子。雖然越來越偏離靜態語言的道路,但從另一個角度來說,這些特性也都是為了提高程序員的生產力。至于被接受與否,還是讓時間來說話吧。

C#進化之道 

PS:這里面還有一點版本號的小插曲——VS2008所對應的.Net Framework是3.5,C#是3.0,CLR是2.0,及其混亂,MS終于下決心在VS2010中把這三個版本號都統一成了4.0,于是CLR3不知所終……

C# 4.0新特性:Dynamically Typed Object

C#4.0加入了dynamic關鍵字,可以申明一個變量的static類型為dynamic(有點繞口)。

在3.0及之前,如果你不知道一個變量的類型,而要去調用它的一個方法,一般會用到反射:

  1. object calc = GetCalculator();  
  2. Type calcType = calc.GetType();  
  3. object res = calcType.InvokeMember("Add",  
  4. BindingFlags.InvokeMethod, null,  
  5. new object[] { 10, 20 });  
  6. int sum = Convert.ToInt32(res); 

有了dynamic,就可以把上面代碼簡化為:

  1. dynamic calc = GetCalculator();  
  2. int sum = calc.Add(10, 20); 

使用dynamic的好處在于,可以不去關心對象是來源于COM, IronPython, HTML DOM或者反射,只要知道有什么方法可以調用就可以了,剩下的工作可以留給runtime。下面是調用IronPython類的例子:

  1. ScriptRuntime py = Python.CreateRuntime();  
  2. dynamic helloworld = py.UseFile("helloworld.py");  
  3. Console.WriteLine("helloworld.py loaded!"); 

dynamic也可以用在變量的傳遞中,runtime會自動選擇一個最匹配的overload方法。

這里有一個demo:把一段javascript代碼拷到C#文件中,將var改成dynamic,function改成void,再改一下構造函數的調用方式(new type()改為win.New.type()),去掉javascript中的win.前綴(因為這已經是C#的方法了),就可以直接運行了。

dynamic的實現是基于IDynamicObject接口和DynamicObject抽象類。而動態方法、屬性的調用都被轉為了GetMember、Invoke等方法的調用。

  1. public abstract class DynamicObject : IDynamicObject  
  2. {  
  3. public virtual object GetMember(GetMemberBinder info);  
  4. public virtual object SetMember(SetMemberBinder info, object value);  
  5. public virtual object DeleteMember(DeleteMemberBinder info);   public virtual object UnaryOperation(UnaryOperationBinder info);  
  6. public virtual object BinaryOperation(BinaryOperationBinder info, object arg);  
  7. public virtual object Convert(ConvertBinder info);   public virtual object Invoke(InvokeBinder info, object[] args);  
  8. public virtual object InvokeMember(InvokeMemberBinder info, object[] args);  
  9. public virtual object CreateInstance(CreateInstanceBinder info, object[] args);   public virtual object GetIndex(GetIndexBinder info, object[] indices);  
  10. public virtual object SetIndex(SetIndexBinder info, object[] indices, object value);  
  11. public virtual object DeleteIndex(DeleteIndexBinder info, object[] indices);   public MetaObject IDynamicObject.GetMetaObject();  

C# 4.0新特性:Named and optional parameters

這似乎不是什么很難實現或很新穎的特性,只要編譯器的支持就可以(VB很早就支持了)。估計加入的原因是群眾的呼聲太高了。

帶有可選參數方法的聲明:

  1. public StreamReader OpenTextFile(  
  2. string path,  
  3. Encoding encoding = null,  
  4. bool detectEncoding = true,  
  5. int bufferSize = 1024); 

命名參數必須在最后使用:

  1. OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096); 

順序不限:

  1. OpenTextFile(bufferSize: 4096, path: "foo.txt", detectEncoding: false); 

Improved COM Interoperability

在C#中在調用COM對象如office對象時,經常需要寫一堆不必要的參數:

  1. object fileName = "Test.docx";  
  2. object missing  = System.Reflection.Missing.Value;  
  3. doc.SaveAs(ref fileName,  
  4. ref missing, ref missing, ref missing,  
  5. ref missing, ref missing, ref missing,  
  6. ref missing, ref missing, ref missing,  
  7. ref missing, ref missing, ref missing,  
  8. ref missing, ref missing, ref missing); 

4.0中就可以直接寫成:

  1. doc.SaveAs("Test.docx"); 

C#4.0對COM交互做了下面幾方面的改進:

  1. Automatic object -> dynamic mapping  
  2. Optional and named parameters  
  3. Indexed properties  
  4. Optional “ref” modifier  
  5. Interop type embedding (“No PIA”) 

對第1點和第5點的簡單解釋如下:

在COM調用中,很多輸入輸出類型都是object,這樣就必須知道返回對象的確切類型,強制轉換后才可以調用相應的方法。在4.0中有了dynamic的支持,就可以在導入這些COM接口時將變量定義為dynamic而不是object,省掉了強制類型轉換。

PIA(Primary Interop Assemblies)是根據COM API生成的.Net Assembly,一般體積比較大。在4.0中運行時不需要PIA的存在,編譯器會判斷你的程序具體使用了哪一部分COM API,只把這部分用PIA包裝,直接加入到你自己程序的Assembly里面。

C# 4.0新特性:Co- and Contra-Variance

實在是不知道怎么翻譯這兩個詞。

(感謝Ariex,徐少俠,AlexChen的提示,應翻譯為協變和逆變,http://msdn.microsoft.com/zh-cn/library/ms173174(VS.80).aspx

在C#中,下面的類型轉換是非法的:

  1. IList< string> strings = new List< string>();  
  2. IList< object> objects = strings; 

因為你有可能會這樣做,而編譯器的靜態檢查無法查出錯誤:

  1. objects[0] = 5;  
  2. string s = strings[0]; 

4.0中在聲明generic的Interface及Delegate時可以加in及out關鍵字,如:

  1. public interface IEnumerable< out T> : IEnumerable  
  2. {  
  3. IEnumerator< T> GetEnumerator();  
  4. }  
  5. public interface IEnumerator< out T> : IEnumerator  
  6. {  
  7. bool MoveNext();  
  8. T Current { get; }  
  9. }  
  10. public interface IComparer< in T>  
  11. {  
  12. 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:

  1. System.Collections.Generic.IEnumerable< out T>  
  2. System.Collections.Generic.IEnumerator< out T>  
  3. System.Linq.IQueryable< out T>  
  4. System.Collections.Generic.IComparer< in T>  
  5. System.Collections.Generic.IEqualityComparer< in T>  
  6. System.IComparable< in T> 

Delegate:

  1. System.Func< in T, …, out R>  
  2. System.Action< in T, …>  
  3. System.Predicate< in T>  
  4. System.Comparison< in T>  
  5. System.EventHandler< in T> 

C# 4.0新特性:Compiler as a Service

4.0中增加了與編譯器相關的API,這樣就可以將字符串作為代碼動態編譯執行,跟javascript好像。

Video的最后,Anders做了一個很酷的demo,大概只用了二三十行代碼,就實現了在控制臺中直接執行C#語句,定義并調用函數,動態創建windows form,添加button等功能,看起來完全不遜色于Python,Ruby之類語言的控制臺。

沉寂了n年之后,CLR終于要出新版本了,這回Jeffrey Richter大俠沒有借口不出新版的CLR via C#了吧:)

本文來自張國良的專欄《c# 4.0新特性一覽》

【編輯推薦】

  1. C# 4.0中的協變和逆變
  2. .NET 4.0 Beta 2將引入新的網絡功能 修復大量Bug
  3. C# 4.0 Dynamic關鍵字全解析
  4. .NET 4.0 Beta 1新增STM特性概覽
  5. 全面總結.NET 4.0新特性:C#和VB.NET的取長補短
責任編輯:yangsai 來源: 張國良的專欄
相關推薦

2009-08-19 16:51:14

C# 4.0 dyna

2009-05-26 09:28:22

C# 4.0dynamic動態類型

2009-08-03 13:55:03

C#基礎知識

2009-05-26 11:15:31

C# 4.0dynamicVisual Stud

2010-01-26 17:44:32

Visual C++開

2009-08-26 17:10:09

C# 3.5新特性

2016-10-13 13:33:41

反射特性c#

2011-05-26 10:27:37

Fedora 15

2013-10-18 14:23:21

Ubuntu 13.1Kbuntu 13.1

2010-08-17 09:57:39

C#

2009-08-27 16:24:48

擴展方法C# 3.0新特性

2025-05-07 08:30:00

2009-08-19 16:50:32

Visual C#C#語言特性

2010-05-25 08:34:10

C# 4.0

2009-08-31 14:45:07

Visual C# 3

2009-10-20 15:03:29

ExpandoObje

2011-01-14 10:27:18

C#.netasp.net

2009-08-04 08:48:44

C#內置特性

2011-12-16 09:24:53

JavaSpring開源框架

2013-11-26 10:00:09

VMware Hori虛擬化Wmware
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区视频 | 91精品久久久久久综合五月天 | 欧美中文在线 | 日韩久久久久久 | 伊人二区| 久久精品成人 | 欧美视频1区 | 日韩精品久久一区 | 亚洲精品视频观看 | 日韩一级| 国产精产国品一二三产区视频 | 一区二区三区 在线 | 草草视频在线免费观看 | 香蕉一区二区 | 亚洲国产欧美一区二区三区久久 | 黄色片免费在线观看 | 你懂的国产 | 美国十次成人欧美色导视频 | 91精品一区二区三区久久久久 | 国产伦精品一区二区三区精品视频 | 99久久婷婷国产综合精品 | 成人h视频在线观看 | 99热热精品 | 九九九久久国产免费 | 殴美成人在线视频 | 在线亚州| 天天夜碰日日摸日日澡 | 91社区在线观看高清 | 久久久久久久久99 | 免费在线一区二区 | 亚洲国产精品久久久久秋霞不卡 | 国产视频久久 | 久久这里只有精品首页 | 色在线免费视频 | av男人天堂影院 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 久久亚洲欧美日韩精品专区 | 久久久久国产一区二区三区 | 天天天插 | 免费一区二区三区在线视频 | 一区二区三区视频在线 |