C# 和 VB.NET 获得 Windows Runtime 支持和异步方法

阅读数:1081 2011 年 9 月 26 日

话题:.NET语言 & 开发

C# 和 VB.NET 将会获得新特性,比如说,Windows Runtime 支持、异步方法和 Caller Info 特性等等。另外,编译器也会获得一些 API,把它对代码的了解暴露给 IDE 和开发者。

微软的Anders Hejlsberg在微软 BUILD 大会上演示了 C# 5.0 和 VB.NET 的新特性。Samuel Jack在他的博文《What's new in C# 5.0 and VB.NET?》里给出了详细的列表。下面是新特性的摘要:

  • Windows Runtime 支持:C# 和 VB.NET 现在已经深度整合到 Windows Runtime 了——C# 项目可以编译成 WinMD 文件,然后在 HTML/JavaScript 项目里引用。InfoQ 之前已经

    详细报道

    过这个特性了。

  • 异步方法:使用 async 和 await 关键字写异步任务更加简单,这在去年 PDC 首次演示,然后再

    Async CTP

    提供预览。

    这些文章

    深入地

    探索

    了这个特性。

  • Caller Info 特性:新的 CallerFilePath、CallerLineNumber 和 CallerMemberName 特性可以在可选方法参数上使用,协助获取调用方的详细信息,但不必从调用方法传递进来。

  • 编译器 API:这个特性应该在 C# 5.0 之后出来。这些 API 将会通过语法树 API、符号 API、绑定和流程分析 API 以及 Emit API 向 IDE 和开发者暴露编译器对代码的了解。你可以在这个

    Microsoft Research 的视频

    获得详细信息。

这些新特性可以使.NET 开发者的工作变得更加简单。比如说,下面这是实现属性更改通知的一个典型模式:

public class Customer : INotifyPropertyChanged

{

   public event PropertyChangedEventHandler PropertyChanged;

   private string _firstName;

   public string FirstName

   {

     get { return _firstName; }

     set { Set(ref _firstName, value, "FirstName"); }

   }

   private void Set(ref T field, T value, string memberName)

   {

      if (!object.Equals(field, value))

      {

         field = value;

         if (PropertyChanged != null)

         PropertyChanged(this, new PropertyChangedEventArgs(memberName));

       }

   }

}

这个模式的问题在于很容易把代码搞乱。如果你在 set 访问器里拼错属性的名字,或者你重命名了属性,那么它会悄然失效。

使用新的类似宏的特性可以避免这种失效:

public class Customer : INotifyPropertyChanged

{

   public event PropertyChangedEventHandler PropertyChanged;

   private string _firstName;

   public string FirstName

   {

      get { return _firstName; }

      set { Set(ref _firstName, value); }

   }

   private void Set(ref T field, T value,[CallerMemberName] string memberName = null)

   {

      if (!object.Equals(field, value))

      {

         field = value;

         if (PropertyChanged != null)

         PropertyChanged(this, new PropertyChangedEventArgs(memberName));

      }

   }

}

类似的,异步编程将会变得更简洁,也会变得更常用,触摸界面将会要求大多数方法都是异步的。Silverlight 开发者将会对此感到欣慰。另外,就像 Anders 演示的“Paste as VB”和“Paste as C#”,编译器 API 将会为.NET 工具开发商带来更多的可能性。有趣的时刻马上就到了!

查看英文原文:C#, VB.NET To Get Windows Runtime Support, Asynchronous Methods