“using”指令应该在 C# 中的命名空间内部还是外部?

Should 'using' directives be inside or outside the namespace in C#?

提问人:benPearce 提问时间:9/24/2008 最后编辑:Muhammad AsadullahbenPearce 更新时间:5/15/2023 访问量:275739

问:

我一直在一些 C# 代码上运行 StyleCop,它一直报告我的指令应该在命名空间内。using

将指令放在命名空间内部而不是外部是否有技术原因?using

C# .NET 命名空间 stylecop 代码组织

评论

91赞 Charlie 1/23/2010
仅供参考,除了每个文件有多个类的问题之外,还有其他含义,因此,如果您不熟悉此问题,请继续阅读。
6赞 gius 12/13/2008
有时,你把使用的地方会有所不同:stackoverflow.com/questions/292535/linq-to-sql-designer-bug
67赞 Jeppe Stig Nielsen 4/12/2017
术语:这些不是陈述;它们是指令。另一方面,语句是一种语言结构,它与方法主体中的其他语句一起出现。例如,是一个与 大致相同的语句。usingusingusingusing (var e = s.GetEnumerator()) { /* ... */ }var e = s.GetEnumerator(); try { /* ... */ } finally { if (e != null) { e.Dispose(); } }
3赞 user1451111 7/27/2018
如果没有人提到这一点,实际上 Microsoft 也建议将语句放在声明中,在其内部编码指南usingnamespace
2赞 Gabriel 12/11/2021
如果将它们用作团队中的约定,将它们放在命名空间之外有助于尽早检测命名冲突,因为它将始终与所有其他 using 指令处于同一级别。

答:

215赞 Mark Cidade 9/24/2008 #1

将它放在命名空间中会使声明成为该文件的该命名空间的本地声明(如果文件中有多个命名空间),但如果每个文件只有一个命名空间,那么无论它们是在命名空间外部还是内部都没有太大区别。

using ThisNamespace.IsImported.InAllNamespaces.Here;

namespace Namespace1
{ 
   using ThisNamespace.IsImported.InNamespace1.AndNamespace2;

   namespace Namespace2
   { 
      using ThisNamespace.IsImported.InJustNamespace2;
   }       
}

namespace Namespace3
{ 
   using ThisNamespace.IsImported.InJustNamespace3;
}

评论

2赞 Jowen 9/26/2013
命名空间提供逻辑分离,而不是物理(文件)分离。
12赞 O. R. Mapper 2/9/2014
没有区别并不完全正确; 块中的指令可以引用基于封闭块的相对命名空间。usingnamespacenamespace
73赞 Mark Cidade 2/11/2014
是的,我明白。五年前,我们在这个问题的公认答案中确定了这一点。
63赞 Quintin Robinson 9/24/2008 #2

根据 Hanselman - Using Directive and Assembly Loading... 和其他此类文章,在技术上没有区别。

我的偏好是将它们放在命名空间之外。

评论

5赞 johnny 8/20/2011
@Chris M:呃......答案中发布的链接表明 In vs. Out 没有任何好处,实际上显示了一个示例,该示例伪造了您发布的链接中提出的声明......
3赞 Chris McKee 8/25/2011
是的,我没有完全阅读该帖子,但当 MVP 说它是对的时,我就买了。一个人反驳了它,解释了它,并进一步展示了他的代码......“无论哪种情况,C# 编译器生成的 IL 都是相同的。事实上,C# 编译器不会生成与每个 using 指令对应的任何内容。using 指令纯粹是 C# ism,它们对 .NET 本身没有任何意义。(使用语句并非如此,但这些是完全不同的东西。groups.google.com/group/wpf-disciples/msg/781738deb0a15c46
91赞 ANeves 10/22/2012
请附上链接的摘要。链接断开时(因为它发生,如果有足够的时间),突然间一个有 32 个赞成票的答案只值钱——几乎没有答案。My style is to put them outside the namespaces.
19赞 Jim Balter 4/17/2016
这里的说法是完全错误的......有技术上的差异,你自己的引文是这样说的......事实上,这就是它的全部意义所在。请删除这个错误的答案...有更好、更准确的。
1赞 Martin 7/2/2021
OP在他们的回答中表示“技术上没有区别”,他们是正确的 - 从技术角度来看没有区别。声称这是一个错误的答案是完全错误的
2390赞 Charlie 9/30/2008 #3

两者之间实际上有一个(微妙的)区别。假设您在 File1.cs 中有以下代码:

// File1.cs
using System;
namespace Outer.Inner
{
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

现在假设有人将另一个文件 (File2.cs) 添加到项目中,如下所示:

// File2.cs
namespace Outer
{
    class Math
    {
    }
}

编译器在查看命名空间外部的这些指令之前会进行搜索,因此它会找到而不是 .不幸的是(或者也许是幸运的?)没有成员,所以 File1 现在被破坏了。OuterusingOuter.MathSystem.MathOuter.MathPI

如果将 放入命名空间声明中,则会更改,如下所示:using

// File1b.cs
namespace Outer.Inner
{
    using System;
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

现在编译器在搜索之前进行搜索,找到 ,一切都很好。SystemOuterSystem.Math

有些人会争辩说,对于用户定义的类来说,这可能是一个不好的名字,因为 ;这里的重点是存在差异,它会影响代码的可维护性。MathSystem

同样有趣的是,如果 is in namespace 而不是 .在这种情况下,添加 File2 会破坏 File1,而不管文件转到哪里。这意味着编译器在查看任何指令之前会搜索最里面的封闭命名空间。FooOuterOuter.InnerOuter.Mathusingusing

评论

1赞 surfmuggle 6/22/2022
基础知识 - c#-9.0 .net-6.0 的程序结构状态。有谁知道这对上面的例子意味着什么?using directives must come first in the file
5赞 T. Sar 6/24/2022
@surfmuggle如果我没记错的话,我相信您的链接专门指的是没有主方法的控制台应用程序。
2赞 phuzi 1/20/2023
@surfmuggle 这特指顶级语句。使用顶级语句时,命名空间必须位于文件中所有其他顶级语句之后,当然也可以在命名空间内添加 using 指令。
61赞 JaredCacurak 9/14/2009 #4

根据 StyleCop 文档:

SA1200:UsingDirectivesMustBePlacedWithinNamespace

原因 C# using 指令位于命名空间元素的外部。

规则说明 当 using 指令或 using-alias 指令放置在命名空间元素之外时,将发生违反此规则的情况,除非该文件不包含任何命名空间元素。

例如,以下代码将导致两次违反此规则。

using System;
using Guid = System.Guid;

namespace Microsoft.Sample
{
    public class Program
    {
    }
}

但是,以下代码不会导致任何违反此规则的行为:

namespace Microsoft.Sample
{
    using System;
    using Guid = System.Guid;

    public class Program
    {
    }
}

此代码将干净地编译,不会出现任何编译器错误。但是,目前尚不清楚正在分配哪个版本的 Guid 类型。如果将 using 指令移动到命名空间内部,如下所示,则会发生编译器错误:

namespace Microsoft.Sample
{
    using Guid = System.Guid;
    public class Guid
    {
        public Guid(string s)
        {
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            Guid g = new Guid("hello");
        }
    }
}

代码因以下编译器错误而失败,该错误位于包含Guid g = new Guid("hello");

CS0576: 命名空间“Microsoft.Sample”包含与别名“Guid”冲突的定义

该代码创建名为 Guid 的 System.Guid 类型的别名,并使用匹配的构造函数接口创建自己的名为 Guid 的类型。稍后,该代码将创建一个 Guid 类型的实例。若要创建此实例,编译器必须在 Guid 的两种不同定义之间进行选择。当 using-alias 指令放置在 namespace 元素之外时,编译器将选择在本地命名空间中定义的 Guid 的本地定义,并完全忽略在命名空间之外定义的 using-alias 指令。不幸的是,这在阅读代码时并不明显。

但是,当 using-alias 指令位于命名空间中时,编译器必须在两个不同的、冲突的 Guid 类型之间进行选择,这两个类型都在同一命名空间中定义。这两种类型都提供匹配的构造函数。编译器无法做出决定,因此它会标记编译器错误。

将 using-alias 指令放在命名空间之外是一种不好的做法,因为它可能会导致混淆,在这种情况下,实际使用的类型版本并不明显。这可能会导致难以诊断的错误。

将 using-alias 指令放在 namespace 元素中可以消除此错误的根源。

  1. 多个命名空间

在单个文件中放置多个命名空间元素通常是一个坏主意,但如果这样做,最好将所有 using 指令放在每个命名空间元素中,而不是全局放在文件顶部。这将严格限定命名空间的范围,并且还有助于避免上述行为。

需要注意的是,当使用放置在命名空间外部的 using 指令编写代码时,在命名空间内移动这些指令时应小心,以确保这不会更改代码的语义。如上所述,将 using-alias 指令放置在 namespace 元素中允许编译器在冲突类型之间进行选择,而当指令放置在命名空间之外时,不会发生这种情况。

如何解决冲突 若要解决与此规则的冲突,请将所有 using 指令和 using-alias 指令移到 namespace 元素中。

评论

2赞 benPearce 9/15/2009
@Jared - 正如我在回答中指出的那样,我首选的解决方法/解决方案是每个文件只有一个类。我认为这是一个相当普遍的惯例。
26赞 Task 3/6/2010
事实上,这也是 StyleCop 的规则!SA1402:C# 文档只能包含根级别的单个类,除非所有类都是部分类且属于同一类型。通过打破一条规则来展示另一条规则只会滴上错误的酱汁。
9赞 nawfal 6/6/2015
赞成成为第一个从 StyleCop 角度实际涵盖它的答案。就我个人而言,我喜欢命名空间之外的视觉感觉。在我看来,内在是如此丑陋。:)usingusing
4赞 Jim Balter 4/17/2016
最后,这个问题得到了一个很好的答案。而本皮尔斯的评论是无关紧要的......这与文件中的类数无关。
39赞 Neo 10/11/2012 #5

当您希望使用别名时,将 using 语句放在命名空间中存在问题。别名不会从前面的语句中受益,并且必须是完全限定的。using

考虑:

namespace MyNamespace
{
    using System;
    using MyAlias = System.DateTime;

    class MyClass
    {
    }
}

对:

using System;

namespace MyNamespace
{
    using MyAlias = DateTime;

    class MyClass
    {
    }
}

如果您有一个冗长的别名,例如以下内容(这就是我发现问题的方式),这可能会特别明显:

using MyAlias = Tuple<Expression<Func<DateTime, object>>, Expression<Func<TimeSpan, object>>>;

使用命名空间内的语句,它突然变成:using

using MyAlias = System.Tuple<System.Linq.Expressions.Expression<System.Func<System.DateTime, object>>, System.Linq.Expressions.Expression<System.Func<System.TimeSpan, object>>>;

不漂亮。

评论

2赞 Jeppe Stig Nielsen 3/23/2016
您需要一个名称(标识符)。如你所指示的那样,不能在类中有一个指令。它必须在命名空间级别上,例如在最外层之外,或者只是在最内层内部(但不是在类/接口/等内部)。classusingnamespacenamespace
1赞 Neo 3/24/2016
@JeppeStigNielsen谢谢。我错误地放错了指令。我已经按照我的意图对其进行了编辑。谢谢你的指出。不过,推理仍然是一样的。using
578赞 Jeppe Stig Nielsen 4/19/2013 #6

这个线程已经有一些很好的答案,但我觉得我可以通过这个额外的答案带来更多细节。

首先,请记住,带有句点的命名空间声明,例如:

namespace MyCorp.TheProduct.SomeModule.Utilities
{
    ...
}

完全等同于:

namespace MyCorp
{
    namespace TheProduct
    {
        namespace SomeModule
        {
            namespace Utilities
            {
                ...
            }
        }
    }
}

如果你愿意,你可以在所有这些级别上放置指令。(当然,我们只想在一个地方有 s,但根据语言,这是合法的。usingusing

解析隐含类型的规则可以粗略地表述为:首先在最里面的“范围”中搜索匹配项,如果在那里找不到任何内容,则从一级到下一个范围并在那里搜索,依此类推,直到找到匹配项。如果在某个级别找到多个匹配项,如果其中一个类型来自当前程序集,则选取该类型并发出编译器警告。否则,放弃(编译时错误)。

现在,让我们在两个主要约定的具体示例中明确说明这意味着什么。

(1) 在外面使用:

using System;
using System.Collections.Generic;
using System.Linq;
//using MyCorp.TheProduct;  <-- uncommenting this would change nothing
using MyCorp.TheProduct.OtherModule;
using MyCorp.TheProduct.OtherModule.Integration;
using ThirdParty;

namespace MyCorp.TheProduct.SomeModule.Utilities
{
    class C
    {
        Ambiguous a;
    }
}

在上述情况下,要找出类型是什么,搜索按以下顺序进行:Ambiguous

  1. 内部嵌套类型(包括继承的嵌套类型)C
  2. 当前命名空间中的类型MyCorp.TheProduct.SomeModule.Utilities
  3. 命名空间中的类型MyCorp.TheProduct.SomeModule
  4. 类型MyCorp.TheProduct
  5. 类型MyCorp
  6. null 命名空间(全局命名空间)中的类型
  7. 、 、 、 、 和 中的类型SystemSystem.Collections.GenericSystem.LinqMyCorp.TheProduct.OtherModuleMyCorp.TheProduct.OtherModule.IntegrationThirdParty

另一个约定:

(2) 内含:

namespace MyCorp.TheProduct.SomeModule.Utilities
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using MyCorp.TheProduct;                           // MyCorp can be left out; this using is NOT redundant
    using MyCorp.TheProduct.OtherModule;               // MyCorp.TheProduct can be left out
    using MyCorp.TheProduct.OtherModule.Integration;   // MyCorp.TheProduct can be left out
    using ThirdParty;

    class C
    {
        Ambiguous a;
    }
}

现在,按以下顺序搜索类型:Ambiguous

  1. 内部嵌套类型(包括继承的嵌套类型)C
  2. 当前命名空间中的类型MyCorp.TheProduct.SomeModule.Utilities
  3. SystemSystem.Collections.GenericSystem.LinqMyCorp.TheProductMyCorp.TheProduct.OtherModuleMyCorp.TheProduct.OtherModule.IntegrationThirdParty
  4. 命名空间中的类型MyCorp.TheProduct.SomeModule
  5. 类型MyCorp
  6. null 命名空间(全局命名空间)中的类型

(请注意,这是“3.”的一部分,因此在“4.”和“5.”之间不需要。MyCorp.TheProduct

结束语

不管你是把 usings 放在命名空间声明里面还是外面,总有可能有人后来将具有相同名称的新类型添加到具有更高优先级的命名空间之一。

此外,如果嵌套命名空间与类型同名,则可能会导致问题。

将 usings 从一个位置移动到另一个位置总是很危险的,因为搜索层次结构会发生变化,并且可能会找到另一种类型。因此,选择一个约定并坚持下去,这样你就不必移动使用。

默认情况下,Visual Studio 的模板将 usings 放在命名空间之外(例如,如果让 VS 在新文件中生成一个新类)。

在外部使用 usings 的一个(微小的)好处是,您可以利用 using 指令来执行全局属性,例如,而不是 .[assembly: ComVisible(false)][assembly: System.Runtime.InteropServices.ComVisible(false)]


更新文件范围的命名空间声明

从 C# 10.0(从 2021 年开始)开始,您可以避免缩进并使用其中任一(约定 1,使用外部):

using System;
using System.Collections.Generic;
using System.Linq;
using MyCorp.TheProduct.OtherModule;
using MyCorp.TheProduct.OtherModule.Integration;
using ThirdParty;

namespace MyCorp.TheProduct.SomeModule.Utilities;

class C
{
    Ambiguous a;
}

或(约定 2,内部使用):

namespace MyCorp.TheProduct.SomeModule.Utilities;

using System;
using System.Collections.Generic;
using System.Linq;
using MyCorp.TheProduct;
using MyCorp.TheProduct.OtherModule;
using MyCorp.TheProduct.OtherModule.Integration;
using ThirdParty;

class C
{
    Ambiguous a;
}

但同样的考虑也适用。

评论

4赞 Paul Evans 3/23/2021
刚刚有一个情况,我继承的类库在 global/null 命名空间中有一些类。其中一个类名与我正在使用的命名空间中的类名相同。“using”在命名空间定义之外。我不明白为什么它总是会选择全局类的定义。碰巧,将命名空间放在外面 - 它选择了我需要的类。你的回答解释了原因。在命名空间外部时,最后选取 null/global。对我来说,这是正确/预期的行为。
2赞 Jeppe Stig Nielsen 3/24/2021
@PaulEvans 您的案例也是一个示例,说明为什么永远不应该将任何内容放在全局命名空间中,尤其是不应该将任何公共内容放在全局命名空间中。您使用的库违反了这一点。
-7赞 Israel Ocbina 10/15/2014 #7

如果那些默认使用,即源解决方案中使用的“引用”应该在命名空间之外,而那些“新添加的引用”应该放在命名空间内,那么更好的做法是你应该把它放在命名空间中。这是为了区分要添加的引用。

评论

6赞 Abel 11/3/2014
不,实际上这是一个坏主意。不应根据使用指令是否是新添加的事实来确定 using 指令的本地范围和全局范围之间的位置。相反,最好将它们按字母顺序排列,但 BCL 引用除外,它应该放在最前面。
9赞 Biscuits 9/17/2016 #8

正如 Jeppe Stig Nielsen 所说,这个线程已经有很好的答案,但我认为这个相当明显的微妙之处也值得一提。

using在命名空间中指定的指令可以使代码更短,因为它们不需要像在外部指定时那样完全限定。

下面的示例之所以有效,是因为 和 类型都位于同一个全局命名空间 .FooBarOuter

假定代码文件 Foo.cs

namespace Outer.Inner
{
    class Foo { }
}

Bar.cs

namespace Outer
{
    using Outer.Inner;

    class Bar
    {
        public Foo foo;
    }
}

这可能会省略指令中的外部命名空间,简称:using

namespace Outer
{
    using Inner;

    class Bar
    {
        public Foo foo;
    }
}

评论

12赞 Keith Robertson 11/3/2016
诚然,您“可以省略外部命名空间”,但这并不意味着您应该省略。对我来说,这是另一个论点,说明为什么使用指令(而不是 @Neo 的答案中的别名)应该超出命名空间,以强制使用完全限定的命名空间名称。
6赞 yakya 6/3/2018 #9

答案中讨论了技术原因,我认为这最终取决于个人喜好,因为差异并不,而且两者都有权衡。Visual Studio 用于创建文件的默认模板使用命名空间之外的指令,例如.csusing

可以通过在项目文件的根目录中添加文件来调整 stylecop 以检查命名空间之外的指令,如下所示:usingstylecop.json

{
  "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
    "orderingRules": {
      "usingDirectivesPlacement": "outsideNamespace"
    }
  }
}

您可以在解决方案级别创建此配置文件,并将其作为“现有链接文件”添加到您的项目中,以便在所有项目之间共享配置。

12赞 Ben Gardner 8/24/2018 #10

另一个我不认为其他答案涵盖的微妙之处是,当您拥有具有相同名称的类和命名空间时。

当您在命名空间中导入时,它将找到该类。如果导入在命名空间之外,则导入将被忽略,并且类和命名空间必须是完全限定的。

//file1.cs
namespace Foo
{
    class Foo
    {
    }
}

//file2.cs
namespace ConsoleApp3
{
    using Foo;
    class Program
    {
        static void Main(string[] args)
        {
            //This will allow you to use the class
            Foo test = new Foo();
        }
    }
}

//file3.cs
using Foo; //Unused and redundant    
namespace Bar
{
    class Bar
    {
        Bar()
        {
            Foo.Foo test = new Foo.Foo();
            Foo test = new Foo(); //will give you an error that a namespace is being used like a class.
        }
    }
}

评论

1赞 Jeppe Stig Nielsen 7/5/2022
我认为这可以通过我在上面的答案中给出的搜索顺序来解释。在你必须说,正如你所说。那里的指令是无用的。但是,在 中,您无权访问命名空间。就像你在方法中说的那样,它只会在类内搜索,而不是在命名空间内搜索。所以你将需要那里。在任何情况下,所有指南都建议不要对命名空间和类型使用相同的名称。file3.csFoo.Foousingfile2.csFoo.DeeperNamespace.SomeClassMainFooFooglobal::Foo.DeeperNamespace
17赞 Hans Kesting 6/5/2019 #11

我遇到的一个皱纹(其他答案中没有涵盖):

假设您有以下命名空间:

  • 某物.其他
  • Parent.Something.其他

当您在 之外使用 时,它指的是第一个 (Something.Other)。using Something.Othernamespace Parent

但是,如果在该命名空间声明使用它,它将引用第二个命名空间声明 (Parent.Something.Other)!

有一个简单的解决方案:添加 “” 前缀:docsglobal::

namespace Parent
{
   using global::Something.Other;
   // etc
}

评论

0赞 Alexander 1/5/2021
好点子!我在使用 RazorGenerator 时遇到了相关问题。不幸的是,似乎它不理解“global::”并将其转换为“using global;”:(遗憾的是,我无法选择是否需要在“命名空间”内部或外部生成“使用”......
4赞 Yrth 7/31/2020 #12

通常,外部指令(例如系统和 Microsoft 命名空间)应放置在指令外部除非另有说明,否则它们是应在所有情况下应用的默认值。这应包括不属于当前项目的任何组织内部库,或引用同一项目中其他主命名空间的指令。引用当前项目和命名空间中其他模块的任何指令都应放在指令。这有两个特定功能:usingnamespaceusingusingnamespace

  • 它提供了本地模块和“其他”模块(即其他所有模块)之间的视觉区分。
  • 它确定要优先应用的本地指令的范围,而不是全局指令。

后一个原因很重要。这意味着很难引入一个模棱两可的引用问题,而该问题可以通过不比重构代码更重要的更改来引入。也就是说,您将方法从一个文件移动到另一个文件,突然出现了一个以前不存在的错误。通俗地说,这是一种“heisenbug”——历史上很难追踪。

评论

13赞 Eric Lippert 3/5/2021
@jwdonahue:当我被邀请加入 C# 功能设计团队时,我已经做了将近十年的专业编译器开发人员和语言设计师,到目前为止,我是房间里资历最浅的人。C# 设计团队肯定会接受来自实习生的好主意;认为 C# 设计团队在设计、评估、指定和实现语言功能方面缺乏经验的说法是不真实的。
7赞 Eric Lippert 3/5/2021
同样,这个答案以一个奇怪且完全相反的假设开始,即框架设计指南的作者只是在列出他们的偏好。事实并非如此。我们在一个满是专家和利益攸关方的房间里对这些准则进行了激烈的辩论。它们是仔细考虑专业开发人员需求的产物。
0赞 jwdonahue 3/6/2021
@EricLippert,事后看来,这是一个我不应该说出的愚蠢想法。道歉。
1赞 andrewf 6/30/2021
我认为这是一个可靠的答案,它在第一段和最后一段中被削弱了(并且可能因为这些原因而被否决了)。我建议只删除第一段和最后一段。
0赞 Yrth 1/29/2022
@andrewf很高兴看到一个回复,它提供了一些可靠的想法来改进帖子。 谢谢。虽然我不太明白最后一段的问题......
6赞 Mike Nakis 12/7/2022 #13
尚未提及:

将指令放在命名空间声明是众所周知的最佳编程实践的应用,即在尽可能小的范围内声明所有内容using

如果最佳编程实践是你的第二天性,那么你会自动做这样的事情。

这可能是将 using 指令放在命名空间声明中的最佳理由,而不管其他地方提到的(边缘)技术(边缘)优点如何;就这么简单。


已经提到过,但也许更好地说明:

将指令放在命名空间可以避免不必要的重复,并使我们的声明更加简洁。using

这太简洁了:

using Com.Acme.Products.Traps.RoadRunnerTraps;
namespace Com.Acme.Products.Traps {

这很甜蜜,切中要害:

namespace Com.Acme.Products.Traps { 
using RoadRunnerTraps;
3赞 AndyDeveloper 4/28/2023 #14

虽然大多数答案倾向于将指令放在声明中,但有趣的是,Microsoft 在 C# 编码约定中的建议另有说明:usingnamespace

将 using 指令放在命名空间声明之外

当 using 指令位于命名空间声明之外时, 导入的命名空间是其完全限定的名称。这更清楚了。 当 using 指令位于命名空间内时,它可以是 相对于该命名空间或其完全限定名称。那是 模糊。

然而,在另一篇文章中,他们规定了相反的规定:

using 语句应位于命名空间声明中。

1赞 Pablo Carrasco Hernández 5/15/2023 #15

这要视情况而定。 根据 StyleCop 的说法,里面。 据Microsoft说,外面。

(只是想要一个真正的简短答案,我阅读了整个线程,但不是每个人都有时间)