C# 当声明了using语句时,为什么有人会在代码中完全限定对象?
我看到的代码声明了正确的using语句,但是代码中的对象是完全限定的,因为声明了using语句,所以它们不需要限定C# 当声明了using语句时,为什么有人会在代码中完全限定对象?,c#,object,C#,Object,我看到的代码声明了正确的using语句,但是代码中的对象是完全限定的,因为声明了using语句,所以它们不需要限定 对象完全限定但仍然声明了using语句,这有什么原因吗?也许using语句是在对象完全限定之后添加的?另一个不太可能的原因是命名空间与正在使用的对象冲突。原因很多。其中一些可能是: 人们倾向于依靠智能感知来找到他们想要的课程 代码已从其他地方粘贴 坏习惯很难改掉 一个好问题是VisualStudio中是否存在消除这种冗余的方法。我不知道有这样的工具(可能类似CodeRush),但可
对象完全限定但仍然声明了using语句,这有什么原因吗?也许using语句是在对象完全限定之后添加的?另一个不太可能的原因是命名空间与正在使用的对象冲突。原因很多。其中一些可能是:
一个好问题是VisualStudio中是否存在消除这种冗余的方法。我不知道有这样的工具(可能类似CodeRush),但可能有人会在这里用它来评论。有时名称空间“冲突”-在多个名称空间中有相同名称的类,完全限定它们可以区分它们。这可能是因为在两个导入的名称空间中有冲突的名称 比如说,
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();
为什么不使用B.B简单地删除
代码>语句?好吧,假设您也在使用类型B.B.Bar
,A.A.FooBar
,B.B.Qux
和A.A.Qux
。您可能希望使用
语句保留。当您使用一些内置重构时,它们有时会完全限定对象。这样可以更安全地避免编译器混淆。我可以想出几个原因:
有多个using语句,嵌套或包含在同一行中,对于方法属性属于哪个对象,存在一些模糊性
using块特别长,语句本身可能不在屏幕上。限定方法和属性可以使其他程序员更容易阅读
项目中可能会有一些非常初级的程序员,他们可能不太理解using语句,并且程序员可能会试图使其更具可读性
为什么有些人(像我)故意这么做
当使用一个相对罕见的类时,它提供了很多关于该类的信息。我喜欢在代码中输入信息。考虑:
System.Runtime.Serialization.Formatters.Soap.SoapFormatter formatter =
new SoapFormatter(); // .NET 2
或
我完全了解这种不一致性,“何时使用”有点武断。但是对于阅读此代码的人来说,很多问题在出现之前就已经得到了回答
Intellisense可以回答同样的问题,但它并不总是可用。发生这种情况的一个原因是:自动生成的代码。(就像Windows窗体设计器生成的代码)是的,CodeRush/Refactor!专业人士做到了。我对“坏习惯”提出质疑。(:我不太确定额外信息带来的好处是否超过了它带来的可读性问题。就我个人而言,在不需要完全限定的代币时看到完全限定的代币是我的一个担忧,我认为这是因为它看起来凌乱且难以阅读。让我们面对它,智能通常是可用的。显然,如果它是requ出于这里提到的各种原因,我需要处理它。我对编译代码的渴望超过了可读代码,只是。@Andy-我不同意。对于不熟悉特定名称空间的人,尤其是不熟悉引用了一大堆名称空间的代码的人,上面的内容确实使代码更容易阅读。虽然我已经尝试过,但我已经做到了从未能够让intellisense处理打印输出。显然,我们只是以不同的方式工作,Jeff。老实说,我很少需要知道类的完整名称空间,这通常不会影响我正确使用它的能力。当然,它必须命名好,但大多数类都是(至少在.Net Framework中).我想我们必须同意在这一点上存在分歧,尽管我可以肯定地说,我从未发现自己打印代码,即使是作为审查过程的一部分。
var formatter = new // .NET 3
System.Runtime.Serialization.Formatters.Soap.SoapFormatter.SoapFormatter();