扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月11日
关键字: 编程
在下列的代码中,对FooBar的引用是不明确的。编译器报告一个错误也就罢了,但是实际上C#编译器挑选FooBar类型的一种可能的情况;直到运行时你才能发现问题:
using Microsoft;
using Richter;
class MyApp {
method void Hi() {
FooBar f = new FooBar(); // Ambiguous, compiler picks
}
}
为了排除这种不明确的引用,你必须显式地告诉编译器,你想创建哪一个FooBar。
using Microsoft;
using Richter;
class MyApp {
method void Hi() {
Richter.FooBar f = new Richter.FooBar(); // 明确引用
}
}
另一种语句形式是允许你为单独类型创建别名,如果你只使用名字空间中的几种类型并且不想用所有的名字空间类型污染整个名字空间的话,这种方法很方便。下列代码示范了另一种解决类型不明确问题的方法。
// 定义RichterFooBar 为Richter.FooBar的别名
using RichterFooBar = Richter.FooBar;
class MyApp {
method void Hi() {
RichterFooBar f = new RichterFooBar(); // 不会出错
}
}
这种方法对于消除类型歧义有用,但不尽人意的地方仍然存在。假设澳大利亚的飞镖(Boomerang)公司(简称ABC)和阿拉斯加的船舶(Boat)公司(也简称ABC)两家公司各自创建了一个类型。可能两家公司都创建了叫做ABC的名字空间,在名字空间中包含一个叫做BuyProduct的类型。任何试图开发需购买飞镖和船舶应用程序的人将会陷入麻烦,除非编程语言提供编程方法来区分两家公司的集合-而不仅仅是两家公司的名字空间。
不幸的是C#语言只支持名字空间,并不提供任何方式来详细说明集合。但实际上碰到这个问题的时候并不多,属于罕见问题。如果是设计希望第三方使用的组件类型。推荐在一个名字空间中定义类型,以便编译器轻松排除类型问题。事实上,应该使用公司全名(不是只取首字母)作为最高级名字空间名来降低冲突的可能性。你能看到Microsoft使用“Microsoft”作为名字空间。
在代码中写一个名字空间声明来创建名字空间是一件很简单的事情。就像下面这样:
namespace CompanyName { // CompanyName
class A { // CompanyName.A
class B { ... } // CompanyName.A.B
}
namespace X { // CompanyName.X
class C { ... } // CompanyName.X.C
}
}
注意名字空间是隐含的公共类型(public)。不能通过任何访问修饰符改变这一点。但可以在内部的名字空间中定义类型(不能在集合外面使用)或者在公共的名字空间中定义类型(能被任何集合访问)。名字空间只表示逻辑上的限制策略,可访问性和包装是通过将名字空间放入一个集合来完成的。
下一次的讨论中,我将阐述所有.NET编程人员必须掌握的简单数据类型、引用类型和数值类型。对于每一个.NET程序,透彻理解数值类型是非常重要的。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者