“using”指令的位置在C#中是否有区别?

“using”指令的位置在C#中是否有区别?,c#,syntax,C#,Syntax,我今天在尝试对现有代码进行格式化时出错。最初,代码在名称空间之外声明了指令,使用的是: using System.Collections.Generic; namespace MyNamespace { using IntPair = KeyValuePair<int, int>; } 我想知道这两种情况有什么不同?使用指令时(导入样式)的位置重要吗?我过去认为这无关紧要,但我总是完全符合使用命令的条件 编辑:选中,第9.4节说明: using指令的范围不包括其对等usin

我今天在尝试对现有代码进行格式化时出错。最初,代码在名称空间之外声明了
指令,使用的是

using System.Collections.Generic;
namespace MyNamespace
{
    using IntPair = KeyValuePair<int, int>;
}

我想知道这两种情况有什么不同?使用
指令时(导入样式)
的位置重要吗?

我过去认为这无关紧要,但我总是完全符合使用命令的条件

编辑:选中,第9.4节说明:

using指令的范围不包括其对等using指令。因此,对等使用指令不会相互影响,并且它们的编写顺序无关紧要


因此,如果System.Collections.Generic和KeyValuePair被视为对等项,那么KeyValuePair将忽略System.Collections.Generic。

是的,它会忽略—在一定程度上。有一个与作用域/本地名称相关的边缘案例,请参阅

有关具体示例(特定于别名用法):

是的,有,我有一个类似的


本质上,如果using指令是全局的(在名称空间之外)或在名称空间内(当它具有更高的优先级时),则名称查找的规则是不同的

这纯粹是信息性的,是一个回复,声称它会影响程序集的加载时间;但实际上,程序集是在使用它们的方法/类型第一次被JIT(或通过反射等方式访问)时加载的

这里有一个例子说明它没有什么区别;在任一位置使用
时,输出都是相同的:
系统。核心
加载为
抖动:

pre-Bar
System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
pre-Max
Max: 5
post-Max
post-Bar
示例(在命令行上运行,而不是在调试器中;理想情况下是在版本配置中运行):

using System;
using Foo = Bar;
public static class Bar {
    public  static void Test() { Console.WriteLine("outer"); }
}
namespace MyNamespace {
    //using Foo = Bar;

    public static class Bar {
        public static void Test() { Console.WriteLine("inner"); }
    }
    static class Program {
        static void Main() {
            Foo.Test();
        }
    }
}
pre-Bar
System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
pre-Max
Max: 5
post-Max
post-Bar
using System;
//using System.Linq;
namespace Foo {
    using System.Linq;
    class Program {
        static Program() {
            AppDomain.CurrentDomain.AssemblyLoad += (s, a) => {
                Console.WriteLine(a.LoadedAssembly.FullName);
            };
        }
        static void Main() {            
            Console.WriteLine("pre-Bar");
            Bar();
            Console.WriteLine("post-Bar");
            Console.ReadLine();
        }
        static void Bar() {
            Console.WriteLine("pre-Max");
            int[] data = { 1, 2, 3, 4, 5 };
            Console.WriteLine("Max: " + Enumerable.Max(data));
            Console.WriteLine("post-Max");
        }
    }
}