簡體   English   中英

什么是全球::?

[英]What is global::?

在C#中,我看到global::經常在自動生成的代碼中使用。 這不是我曾經用過的東西,所以我不知道目的是什么。 有人可以解釋一下嗎?

global指的是全局命名空間,它可用於解決可能重新定義類型的問題。 例如:

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
        }
    }
}

它是一個必要的前綴,表示根命名空間。

它經常被添加到生成的代碼中,以避免與用戶代碼的名稱沖突。

例如,假設您有一個名為System的類,但之后您想使用System.String 您可以使用global::System.String來區分。

我相信::來自C ++,它被用作命名空間分隔符。

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

global上下文關鍵字,當它出現在::運算符之前時,引用全局命名空間,它是任何C#程序的默認命名空間,否則是未命名的。

global:: specifier告訴編譯器從root開始查找命名空間或類。 您將在系統生成的代碼中看到它,以便代碼始終有效。 這樣,如果您當前命名空間下的命名空間與代碼嘗試訪問的頂級命名空間相同,則不會發生沖突。

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

global:: namespace及其標識符並不是大多數人的想法。 它不是應用程序中創建的所有內容的通用標識符,它位於應用程序定義的名稱空間之外,並且附加到某個全局根目錄。

如果在頂級命名空間之外創建類或類型,則可以假設它自動成為GLOBAL命名空間的一部分,並且可以由應用程序或程序集中的所有文件中的global:: identifier訪問。 事實上,這些名稱更常出現在該文件的編譯LOCAL范圍內,但可以通過global:: identifier訪問。

如果在aspx.cs文件中創建頂級類或命名空間,則可以通過global::從該文件中的全局命名空間訪問它。 但是,如果在另一個文件中鍵入global:: ,則該類和命名空間在全局命名空間中不存在。 但是,如果在class.cs文件中創建相同的類或命名空間,則這些項可通過global::和全局命名空間以及該文件的本地范圍用於所有其他文件。 為什么?

事實證明, global::實際上是對文件范圍下的頂級LOCAL名稱以及程序集共享的GLOBAL名稱的引用(就像在典型的ASP.NET項目中可能在App_Code類文件中編譯的那樣)。

我發現這非常令人困惑並且不一致,因為global::意味着訪問在應用程序中創建的頂級命名空間和類型,這些命名空間與全局命名空間相關聯。 默認情況下,某些類似“系統”在所有文件中都綁定到全局命名空間,但自定義的可能會也可能不依賴於該文件的范圍。 這就是全局標識符具有解決對本地根作用域名稱的引用的次要角色的原因。

您可以通過在應用程序的某些部分創建頂級命名空間和類,然后使用global::來查看它可以從應用程序的不同部分在全局命名空間中訪問哪些以及哪些不能訪問,來測試這一點。 它無法訪問的那個被明確地分配給該文件中的“本地全局范圍”, global::幫助您在命名沖突中訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM