“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");
}
}
}