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

c# 4.0新特性一览

终于静下心来仔细听了平通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加盟了相同堆语法糖,并于没有改CLR的状况下引入了Linq,简直是神来之笔,即使多类由各个各种如性能之类的原故没使,但分外适合小型程序的速开,减轻了程序员的工作量,也提升了代码的可读性;C#4.0日增了动态语言的风味,从其中可以看看这个多javascript、python这多少个动态语言的影子。尽管越来越离静态语言的征途,但自其余一个角度来说,这多少个特征也仍然为增强程序员的生产力。至于给奉吗,仍然深受时间来说话吧。

发展历史 1

PS:这中间还有少数本子号的稍插曲——VS2008所对应之.Net
Framework是3.5,C#凡3.0,CLR是2.0,及其混乱,MS终于下决心在VS2010曰镪把当时五个版本号都合并成了4.0,于是CLR3不知所终……

 

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。下面是调动用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);

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

针对第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里面。

Co- and Contra-Variance

实在是不精通怎么翻译这片单词。

(感谢Ariex,徐少侠,AlexChen的升迁,应翻译为协变和逆变,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的末梢,Anders做了一个雅怪的demo,大概唯有所以了二三十履代码,就实现了在控制布Rhys托(Stowe)一直执行C#言,定义并调用函数,动态创造windows
form,添加button等于职能,看起了无逊色于Python,Ruby之类语言的控制台。

 

安静了n年将来,CLR终于使出新本子了,这回Jeffrey
Richter大侠没有借口不有新版的CLR 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

发表评论

电子邮件地址不会被公开。 必填项已用*标注