C# 当声明了using语句时,为什么有人会在代码中完全限定对象?

C# 当声明了using语句时,为什么有人会在代码中完全限定对象?,c#,object,C#,Object,我看到的代码声明了正确的using语句,但是代码中的对象是完全限定的,因为声明了using语句,所以它们不需要限定 对象完全限定但仍然声明了using语句,这有什么原因吗?也许using语句是在对象完全限定之后添加的?另一个不太可能的原因是命名空间与正在使用的对象冲突。原因很多。其中一些可能是: 人们倾向于依靠智能感知来找到他们想要的课程 代码已从其他地方粘贴 坏习惯很难改掉 一个好问题是VisualStudio中是否存在消除这种冗余的方法。我不知道有这样的工具(可能类似CodeRush),但可

我看到的代码声明了正确的using语句,但是代码中的对象是完全限定的,因为声明了using语句,所以它们不需要限定


对象完全限定但仍然声明了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();