【发布时间】:2009-09-04 15:03:33
【问题描述】:
我正在查看声明了正确 using 语句的代码,但由于声明了 using 语句,代码中的对象在不需要时是完全限定的。
对象是完全限定的,但仍然声明了 using 语句,有什么原因吗?
【问题讨论】:
我正在查看声明了正确 using 语句的代码,但由于声明了 using 语句,代码中的对象在不需要时是完全限定的。
对象是完全限定的,但仍然声明了 using 语句,有什么原因吗?
【问题讨论】:
也许 using 语句是在对象完全限定之后添加的?另一个不太可能的原因是与正在使用的对象存在命名空间冲突。
【讨论】:
为什么有些人(比如我)故意这样做:
当使用一个相对稀有的类时,它提供了很多关于该类的信息。我喜欢在代码中加入信息。考虑:
System.Runtime.Serialization.Formatters.Soap.SoapFormatter formatter =
new SoapFormatter(); // .NET 2
或
var formatter = new // .NET 3
System.Runtime.Serialization.Formatters.Soap.SoapFormatter.SoapFormatter();
我完全了解不一致之处,并且“何时使用”有点随意。但是对于阅读此代码的人来说,很多问题在出现之前就已经得到了解答。
Intellisense 可以回答相同的问题,但并不总是可用。
【讨论】:
有时命名空间“冲突” - 在多个命名空间中有同名的类,完全限定它们可以区分它们。
【讨论】:
这可能是因为两个导入的命名空间中存在冲突的名称。
比如说,A.A 有一个名为Foo (A.A.Foo) 的类型,而B.B 有一个名为Foo (B.B.Foo) 的类型。如果你这样做:
using A.A;
using B.B;
// class definitions... etc
var x = new Foo(); // which foo?
如果您不想完全限定它,您可以这样做:
using A.A;
using B.B;
using AFoo = A.A.Foo;
using BFoo = B.B.Foo;
// class definitions... etc
var x = new AFoo();
为什么不简单地删除using B.B; 语句?好吧,假设您也在使用类型B.B.Bar、A.A.FooBar、B.B.Qux 和A.A.Quux。你会想要保留using 语句。
【讨论】:
有很多原因。一些可能是:
一个很好的问题是 Visual Studio 中是否存在消除这种冗余的方法。我不知道有这样的工具(可能是 CodeRush 之类的工具),但也许有人会在这里发表评论。
【讨论】:
当您使用某些内置重构时,它们有时会完全限定对象。这样更安全,可以避免编译器混淆。
【讨论】:
我能想到几个原因:
【讨论】:
发生这种情况的一个原因是:自动生成的代码。 (如 Windows 窗体设计器生成的代码)
【讨论】: