新特点一览

正文转自:http://www.cnblogs.com/zuiyirenjian/archive/2012/08/04/2622650.html

到底静下心来仔细听了三遍Anders
Hejlsberg
(Visual
Studio组的TECHNICAL FELLOW,C#的设计者之一)在PDC08上讲的“The Future of
C#”(http://channel9.msdn.com/pdc2008/TL16/)。

c# 4.0新个性一览

终于静下心来仔细听了2遍Anders
Hejlsberg
(Visual
Studio组的TECHNICAL FELLOW,C#的设计者之一)在PDC08上讲的“The Future of
C#”(http://channel9.msdn.com/pdc2008/TL16/)。

回顾C#升高的历史,C#1.0全然是效仿Java,并保留了C/C++的片段特征如struct,新大方很不难上手;C#2.0加入了泛型,也与Java1.5的泛型如出一辙;C#3.0出席了一堆语法糖,并在未曾改动CLXC90的气象下引入了Linq,大约是点睛之笔,即使很多品种由于各类各类如质量之类的缘故并未选取,但十分适合小型程序的长足支付,减轻了程序员的工作量,也加强了代码的可读性;C#4.0充实了动态语言的特征,从中间可以见到很多javascript、python这个动态语言的黑影。即便越来越偏离静态语言的道路,但从另1个角度来说,那些特点也都以为了拉长度序员的生产力。至于被接受与否,依然让时刻的话话吧。

图片 1

PS:这其中还有一些本子号的小插曲——VS二〇〇八所对应的.Net
Framework是3.5,C#是3.0,CLLX570是2.0,及其混乱,MS终于下决心在VS20第10中学把那三个版本号都统10%了4.0,于是CL奥德赛3不知所终……

回顾C#发展的历史,C#1.0通通是仿照Java,并保留了C/C++的一对特征如struct,新大方很不难上手;C#2.0投入了泛型,也与Java1.5的泛型如出一辙;C#3.0投入了一堆语法糖,并在并未改动CL福特Explorer的景象下引入了Linq,简直是点睛之笔,即使很多种类由于各个各类如品质之类的原因没有利用,但格外适合小型程序的迅速支付,减轻了程序员的工作量,也增强了代码的可读性;C#4.0充实了动态语言的特点,从里头能够看出很多javascript、python这几个动态语言的影子。即使越来越偏离静态语言的征途,但从另多个角度来说,那个特色也都以为着进步程序员的生产力。至于被接受与否,依旧让岁月来说话吧。 

 

图片 2

Dynamically Typed Object

C#4.0投入了dynamic关键字,能够发圣元个变量的static类型为dynamic(有点绕口)。

在3.0及此前,即便你不晓得1个变量的项目,而要去调用它的一个格局,一般会用到反射:

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。上面是调用IronPython类的例证:

ScriptRuntime py = Python.CreateRuntime();
dynamic helloworld = py.UseFile("helloworld.py");
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等方法的调用。

public abstract class DynamicObject : IDynamicObject
{
public virtual object GetMember(GetMemberBinder info);
public virtual object SetMember(SetMemberBinder info, object value);
public virtual object DeleteMember(DeleteMemberBinder info);   public virtual object UnaryOperation(UnaryOperationBinder info);
public virtual object BinaryOperation(BinaryOperationBinder info, object arg);
public virtual object Convert(ConvertBinder info);   public virtual object Invoke(InvokeBinder info, object[] args);
public virtual object InvokeMember(InvokeMemberBinder info, object[] args);
public virtual object CreateInstance(CreateInstanceBinder info, object[] args);   public virtual object GetIndex(GetIndexBinder info, object[] indices);
public virtual object SetIndex(SetIndexBinder info, object[] indices, object value);
public virtual object DeleteIndex(DeleteIndexBinder info, object[] indices);   public MetaObject IDynamicObject.GetMetaObject();
}

 

 

Named and optional parameters

这就像不是怎么着很难落到实处或很时髦的特点,只要编写翻译器的支持就足以(VB很已经援救了)。猜测加入的原因是群众的意见太高了。

涵盖可选参数方法的扬言:

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);

PS:这些中还有一些本子号的小插曲——VS二〇一〇所对应的.Net
Framework是3.5,C#是3.0,CLCR-V是2.0,及其混乱,MS终于下决心在VS20第10中学把那三个版本号都合并成了4.0,于是CLLAND3不知所终……

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");

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”)

对第贰点和第⑥点的简约表明如下:

在COM调用中,很多输入输出类型都以object,那样就务须领会再次来到对象的适宜品种,强制转换后才能够调用相应的点子。在4.0中有了dynamic的支撑,就足以在导入这一个COM接口时将变量定义为dynamic而不是object,省掉了强制类型转换。

PIA(Primary Interop Assemblies)是基于COM API生成的.Net
Assembly,一般容量相比大。在4.0中运作时不需求PIA的存在,编写翻译器会判定你的主次具体行使了哪一部分COM
API,只把那部分用PIA包装,直接加入到您自个儿程序的Assembly里面。

 

Co- and Contra-Variance

实则是不亮堂怎么翻译那八个词。

(感激Ariex,徐少侠,亚历克斯Chen的提拔,应翻译为协变和逆变,http://msdn.microsoft.com/zh-cn/library/ms173174(VS.80).aspx)

在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>

Dynamically Typed Object

C#4.0投入了dynamic关键字,能够发美赞臣(Meadjohnson)个变量的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。上面是调用IronPython类的例证:

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

dynamic也足以用在变量的传递中,runtime会自动选取三个最匹配的overload方法。

此间有1个demo:把一段javascript代码拷到C#文本中,将var改成dynamic,function改成void,再改一下构造函数的调用方式(new
type()改为win.New.type()),去掉javascript中的win.前缀(因为那已经是C#的方法了),就足以从来运营了。

dynamic的兑现是基于IDynamicObject接口和DynamicObject抽象类。而动态方法、属性的调用都被转为了GetMember、Invoke等格局的调用。

public abstract class DynamicObject : IDynamicObject{public virtual object GetMember(GetMemberBinder info);public virtual object SetMember(SetMemberBinder info, object value);public virtual object DeleteMember(DeleteMemberBinder info);   public virtual object UnaryOperation(UnaryOperationBinder info);public virtual object BinaryOperation(BinaryOperationBinder info, object arg);public virtual object Convert(ConvertBinder info);   public virtual object Invoke(InvokeBinder info, object[] args);public virtual object InvokeMember(InvokeMemberBinder info, object[] args);public virtual object CreateInstance(CreateInstanceBinder info, object[] args);   public virtual object GetIndex(GetIndexBinder info, object[] indices);public virtual object SetIndex(SetIndexBinder info, object[] indices, object value);public virtual object DeleteIndex(DeleteIndexBinder info, object[] indices);   public MetaObject IDynamicObject.GetMetaObject();}

 

Compiler as a Service

4.0中追加了与编译器相关的API,那样就足以将字符串作为代码动态编写翻译执行,跟javascript好像。

Video的尾声,安德斯做了二个很酷的demo,大约只用了二三十行代码,就达成了在控制弗罗茨瓦夫一直执行C#说话,定义并调用函数,动态创立windows
form,添加button等职能,看起来完全不逊色于Python,Ruby之类语言的控制台。

 

恬静了n年之后,CL宝马X3终于要出新本子了,那回杰夫rey
Richter英雄没有借口不出新版的CL大切诺基 via C#了吧:)

 

Reference:

  1. 视频: http://channel9.msdn.com/pdc2008/TL16/
  2. PPT:http://mschnlnine.vo.llnwd.net/d1/pdc08/PPTX/TL16.pptx
  3. 演示代码及文档(New features in C#
    4.0):http://code.msdn.microsoft.com/csharpfuture

Named and optional parameters

那仿佛不是怎么着很难落实或很新颖的天性,只要编译器的协助就能够(VB很已经支持了)。估算出席的缘故是民众的呼吁太高了。

含有可选参数方法的宣示:

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");

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”)

对第叁点和第肆点的简要解释如下:

在COM调用中,很多输入输出类型都是object,那样就务须通晓再次回到对象的熨帖品种,强制转换后才得以调用相应的法门。在4.0中有了dynamic的协理,就能够在导入那个COM接口时将变量定义为dynamic而不是object,省掉了恐吓类型转换。

PIA(Primary Interop Assemblies)是依据COM API生成的.Net
Assembly,一般体量比较大。在4.0中运作时不供给PIA的留存,编写翻译器会判定你的次序具体行使了哪一部分COM
API,只把那有个别用PIA包装,直接进入到你协调程序的Assembly里面。

Co- and Contra-Variance

实在是不知晓怎么翻译那多少个词。

(多谢Ariex,徐少侠,亚历克斯Chen的提醒,应翻译为协变和逆变,http://msdn.microsoft.com/zh-cn/library/ms173174(VS.80).aspx)

在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的末梢,安德斯做了3个很酷的demo,大致只用了二三十行代码,就落到实处了在控制哈博罗内向来执行C#言语,定义并调用函数,动态创立windows
form,添加button等职能,看起来完全不逊色于Python,Ruby之类语言的控制台。

 

清净了n年现在,CLLAND终于要出新本子了,那回杰夫rey
Richter英雄没有借口不出新版的CLLAND via C#了吧:)

 

Reference:

  1. 视频: http://channel9.msdn.com/pdc2008/TL16/
  2. PPT:http://mschnlnine.vo.llnwd.net/d1/pdc08/PPTX/TL16.pptx
  3. 示范代码及文档(New features in C# 4.0):http://code.msdn.microsoft.com/csharpfuture
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图