在C#中,何时需要使用extern alias关键字?

34

在C#中,什么时候必须使用extern alias关键字?

2个回答

34

基本上,只有在您要使用来自不同程序集的具有相同完全限定名称(相同命名空间,相同类型名称)的两种类型时才真正需要它。您为每个程序集声明一个不同的别名,因此可以通过该别名引用它们。

不用说,最好一开始就避免陷入这种情况 :)


仅仅是补充一下 - 即使在消费者*.cs文件的顶部添加了extern alias声明,编译器默认情况下也不会查找我正在使用的类型(该类型存在于该程序集中)。编译器的默认行为始终是在具有“global”别名的当前和引用程序集中搜索类和类型。我最终使用完全限定的类型名称,以extern alias名称开头,例如我的extern alias声明是extern alias WidgetsVendor1;,但我仍然要编写这样的代码:var wid = new WidgetsVendor1.Widgets.Widget();。我不能简单地这样做- var wid = new Widgets.Widget(); - RBT
2
@RBT:不,它只是声明别名。但是你可以使用using WidgetsVendor1.Widgets;,然后编写var wid = new Widget(); - Jon Skeet
哦,有趣!我不知道那个。我根据早上的观察发表了我的评论。好知道这个。我能够使用“using”关键字在外部别名中导入命名空间。谢谢。 - RBT

33

它的存在是为了帮助您从版本控制所挖的深坑中脱身。例如,假设您的程序的第一个版本使用了这个类:

using System;

namespace Acme.Financial.Banking {
  [Serializable]
  public class BankAccount {
    public double Balance { get; set; }
    //...
  }
}

而你一直在使用它序列化许多银行账户记录。突然一个会计开始抱怨资产负债表的差异达到了十亿分之一分之一美分,于是你修改了这个类:

  public decimal Balance { get; set; }

问题已解决,下一个客户的资产表很快乐。直到你被要求升级一个使用旧格式大量序列化记录的现有客户。这是个大问题,因为类已经发生了改变,所以无法再反序列化记录。

extern alias 可以解决你的问题,在你的代码中可以引用旧版本和新版本的类,即使命名空间和类名相同。


3
使用extern alias的用例非常有见地。 - RBT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接