2009-01-13 47 views
5

我在嘗試對現有代碼進行一些格式化時遇到了錯誤。原來,該代碼已聲明的名稱空間外的using指令:`using`指令的位置在C#中有所不同嗎?

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

當我試圖插入using指令的語​​句中(遵守了StyleCop的規則),我在混疊指令錯誤,我必須完全符合條件:

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

我想知道兩種情況之間有什麼區別? (導入式)using指令的位置是否重要?

回答

6

我曾經認爲它並不重要,但我總是完全符合使用命令。

編輯:經過所述C# spec,部分9.4說:

一個using-directive的範圍特別不using指令包括對等體。因此,同行使用指令不會相互影響,並且它們的寫入順序不重要。

因此,如果將System.Collections.Generic和KeyValuePair視爲同級,則KeyValuePair將忽略System.Collections.Generic。

5

是的,它確實 - 在一定程度上。與範圍/本地名稱有關的邊緣案例,請參閱Eric Lippert's blog

對於(特定於別名使用)的具體例子:

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(); 
     } 
    } 
} 
1

是是的話,我有一個working example到類似question (Namespace collisions)

實質上,如果using指令是全局的(名稱空間之外),或者在名稱空間中的優先級更高時,名稱查找規則是不同的。

1

這是純粹的信息性的,是聲稱它影響程序集加載時間的答覆之一;但實際上,程序集第一次使用它們的方法/類型被加載(或通過反射等訪問)。

下面是一個顯示它沒有區別的例子;與在任一位置的using,輸出是相同的:System.Core加載爲Bar被即時編譯:

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"); 
     } 
    } 
} 
相關問題