2009-06-05 138 views
9

鑑於此聲明:這兩個聲明有什麼區別?

using System; 
using System.Collections; 
using System.Collections.Generic; 

namespace AProject.Helpers 
{ 
    public static class AClass 
    { 

和本聲明

namespace AProject.Helpers 
{ 
    using System; 
    using System.Collections; 
    using System.Collections.Generic; 

    public static class AClass 
    { 

在那裏它們之間任何的意義有什麼區別?或者只是編碼風格的差異?

我總是用來聲明我的類像第一個,但最近注意到微軟uses the second

+1

似乎是一個重複的問題。請參閱出色答卷 「[應Usings是命名空間內部或外部] [1]」 [1]:http://stackoverflow.com/questions/125319/should-usings-be-inside-或在名稱空間外 – tsemer 2012-08-03 06:53:12

回答

26

在後一版本中,using指令僅適用於名稱空間聲明內。

在大多數情況下,你只能有一個名稱空間聲明:

// Using directives 
... 
namespace X 
{ 
    // Maybe more using directives 
    // Code 
} 
// End of file 

的主要區別是,如果你有在同一文件的多個命名空間:

// Using directives 
... 
namespace X 
{ 
    // Maybe more using directives 
    // Code 
} 

namespace Y 
{ 
    // Maybe more using directives 
    // Code 
} 
// End of file 

在這種情況下,使用命名空間X聲明中的指令不會影響名稱空間Y聲明內的代碼,反之亦然。

但是,這不是唯一的區別 - 有一個subtle case which Eric Lippert points out即使僅使用一個名稱空間聲明,也可以影響代碼。 (基本上,如果您在名稱空間X聲明中寫入using Foo;,並且存在名稱空間X.Foo以及Foo,則行爲會發生變化。可以使用名稱空間別名來補救此問題,例如using global::Foo;(如果您確實需要)。)

個人而言,我會堅持到:每個文件

  • 一個命名空間聲明(和每個文件通常一個頂級型)
  • 使用空間聲明之外的指令
+0

像往常一樣好的答案喬恩。 +1 – 2009-07-02 13:08:41

6

它使該命名空間的本地使用指令,實際上應該沒有什麼區別,因爲你(希望)不是在單個源文件的多個命名空間中聲明多個類型。

詳情here

+0

它可以在邊緣情況下有所作爲。請參閱我答案中的鏈接。 – 2009-06-05 06:24:09

0

我想可能有理由使用第二個選擇從純粹的角度來看,因爲它更清楚地表明using指令的範圍是什麼。

0

在第一個示例中,使用聲明對整個文件是「全局」的。在第二個例子中,using語句只適用於命名空間塊中包裝的代碼。

我認爲唯一真正重要的是如果文件中有多個命名空間,並且想限制哪個命名空間可以訪問每個使用聲明。

2

的第二可以是模棱兩可的;

頂一個清楚你的這些命名空間之後:

  • 系統
  • System.Collections中
  • System.Collections.Generic

,而第二個將首先查找這些命名空間:

  • 個AProject.Helpers.System
  • AProject.Helpers.System.Collections
  • AProject.Helpers.System.Collections.Generic

,並參考他們,而不是他們是否發現了...如果沒有,他們都會引用相同的命名空間。

第二個的安全改寫爲:

namespace AProject.Helpers 
{ 
    using global::System; 
    using global::System.Collections; 
    using global::System.Collections.Generic; 
} 
0

而對於阿爾揚指出的過程中,它被認爲是不好的做法,聲明你的命名空間中usings。它們可以被另一個命名空間隱式覆蓋。

1

另一個重要它們之間的區別出現在使用LINQ-to-SQL和生成的datacontext類時。例如,羅斯文示例數據庫;最初,你會得到:

  • Northwind.dbml
    • Northwind.dbml.layout
    • Northwind.designer.cs

如果你現在想要通過添加擴展部分類自己Northwind.cs,你

  • Northwind.dbml
    • Northwind.dbml.layout
    • Northwind.designer.cs
    • Northwind.cs

有趣的是,存在在代碼發生器(MSLinqToSQLGenerator)中的錯誤 - 這意味着,如果using指令是命名空間(就像他們在默認情況下),它打破 - 與消息:

The custom tool 'MSLinqToSQLGenerator' failed. Unspecified error

而且Northwind.designer.cs文件被刪除。沒有更多的數據上下文!

但是,如果移動using指令命名空間(並重新運行自定義工具 - 右擊解決方案瀏覽器),它工作正常。

所以:這不是一個語言細節 - 它只是代碼生成器中的一個錯誤;但「正常工作」和生成的代碼被刪除之間存在相當大的區別...

請注意,您也可以簡單地通過調用文件的不同內容來修復此問題 - 如NorthwindExtras.cs

怪異。