2013-02-22 92 views
67

在C#中,我經常在自動生成的代碼中看到global::。這不是我曾經用過的自己,所以我不知道它的目的是什麼。有人可以解釋這個嗎?什麼是全球::?

+1

http://stackoverflow.com/questions/3552763/why-use-global-keyword-in-net – 2013-02-22 10:51:49

+2

從msdn:http://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx – 2013-02-22 10:52:46

回答

59

全球是指全局命名空間,它可以用來解決問題,讓你可以重新定義類型。例如:

class foo 
{ 
    class System 
    { 

    } 

} 

如果你使用一種系統,其中,將在Foo類進行局部範圍,你可以使用:

global::System.Console.WriteLine("foobar"); 

訪問全局命名空間。

using System; 

class Foo 
{ 
    public void baz() 
    { 
     Console.WriteLine("Foo 1"); 
    } 
} 

namespace Demo 
{ 
    class Foo 
    { 
     public void baz() 
     { 
      Console.WriteLine("Foo 2"); 
     } 
    } 

    class Program 
    { 
     protected static global::Foo bar = new global::Foo(); 

     static void Main(string[] args) 
     { 
      bar.baz(); // would write Foo 1 to console as it refers to global scope 
      Foo qux = new Foo(); 
      qux.baz(); // would write Foo 2 to the console as it refers to the Demo namespace 
     } 
    } 
} 
+0

如果我有一個帶有全局名稱空間前綴的類的自動生成的類,並且該類名爲Foo,那麼會發生什麼?我有一個我創建的類,也稱爲Foo,它也沒有名稱空間? – 2013-02-22 11:07:04

+0

如果自動生成的類以全局名稱空間爲前綴並且名爲Foo,則global將引用全局名稱空間中的類。在任何名稱空間中只能有一個具有相同名稱的定義。如果您要從另一個名稱空間內創建類的實例,從而爲Foo定義了另一個含義,則它將佔用本地最多的作用域。請參閱編輯 – chrisw 2013-02-22 11:19:20

17

這表明根命名空間的某個時候,必要的前綴。

它經常加入到生成的代碼,以避免名稱衝突與用戶代碼。

例如,假設您有一個名爲System的課程,但您希望使用System.String。您可以使用global::System.String來區分。

相信::來自C++使用它的一個命名空間分隔。

在實踐中,我從來沒有使用過,除了在生成代碼。請注意,您也可以通過使用別名來解決一些衝突。例如using String = System.String;

12

global上下文關鍵字,當談到::運算之前,指的是全局命名空間,這是任何C#程序的默認命名空間,否則命名。

global::符告訴編譯器開始尋找從根本上命名空間或類起動。您將在系統生成的代碼中看到它,以便代碼始終有效。這樣,如果您的當前命名空間下有一個名稱空間,與代碼嘗試訪問的頂級命名空間相同,則不會有衝突。

例如,假設您有命名空間A和命名空間B以及命名空間B.A,如果我在命名空間B.A中編寫需要引用命名空間A中的類的代碼,而沒有全局::我無法獲取它。如果我引用A.classname,編譯器將在B.A.中查找classname。使用global ::我可以告訴它在global :: A.classname中查找classname,它會在適當的位置找到classname。

+12

如果您從網上資源獲取內容,請提供適當的歸屬信息:[MSDN](http://msdn.microsoft.com/zh-cn/com/en-us/library/cc713620.aspx)和[什麼是C#中的全局關鍵字](http://blog.dmbcllc.com/what-is-the-global-keyword-in-csharp/) – Bart 2013-02-26 10:47:07

+2

k .. @巴特感謝您的評論當我下次回答時,我會記住。但爲什麼這是downvote? – coder 2013-02-26 11:29:30

+0

那不是我的。 – Bart 2013-02-26 11:34:20