Apa itu global ::?


116

Di C # saya melihat global::cukup sering digunakan dalam kode yang dibuat secara otomatis. Itu bukan sesuatu yang pernah saya gunakan sendiri jadi saya tidak tahu apa tujuannya. Bisakah seseorang menjelaskan ini?




Jawaban:


104

global mengacu pada namespace global, ini dapat digunakan untuk memecahkan masalah di mana Anda dapat mendefinisikan ulang tipe. Sebagai contoh:

class foo
{
    class System
    {

    }

}

Jika Anda menggunakan Sistem yang akan dicakup secara lokal di kelas foo, Anda dapat menggunakan:

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

untuk mengakses namespace global.

Contoh

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

Apa yang akan terjadi jika saya memiliki kelas yang dibuat secara otomatis dengan kelas yang diawali dengan namespace global dan kelas itu disebut Foo. Saya memiliki kelas yang telah saya buat yang juga disebut Foo juga tanpa namespace?
Sachin Kainth

Jika kelas yang dibuat secara otomatis diawali dengan namespace global dan disebut Foo, global akan merujuk ke kelas di namespace global. Hanya ada satu definisi dengan nama yang sama di namespace mana pun. Jika Anda membuat instance kelas dari dalam namespace lain di mana Anda mendefinisikan arti lain untuk Foo, itu akan mengambil cakupan paling lokal. Lihat edit
chrisw

26

Ini adalah awalan yang terkadang diperlukan yang menunjukkan ruang nama root.

Ini sering ditambahkan ke kode yang dihasilkan untuk menghindari bentrokan nama dengan kode pengguna.

Misalnya, bayangkan Anda memiliki sebuah kelas yang dipanggil System, tetapi kemudian Anda ingin menggunakannya System.String. Anda bisa menggunakan global::System.Stringuntuk membedakan.

Saya percaya itu ::berasal dari C ++ di mana itu digunakan sebagai pemisah namespace.

Dalam prakteknya saya tidak pernah menggunakannya, selain dalam menghasilkan kode. Perhatikan bahwa Anda juga dapat mengatasi beberapa konflik dengan menggunakan alias. Sebagai contohusing String = System.String;


14

Kata globalkunci kontekstual, jika muncul sebelum operator ::, mengacu pada namespace global, yang merupakan namespace default untuk program C # dan sebaliknya tidak dinamai.

The global::specifier memberitahu compiler untuk mulai mencari namespace atau kelas mulai dari akar. Anda akan melihatnya dalam kode yang dihasilkan sistem sehingga kode tersebut selalu berfungsi. Dengan begitu, jika Anda memiliki namespace tepat di bawah namespace Anda saat ini yang sama dengan namespace tingkat atas yang coba diakses kode, tidak akan ada konflik.

Misalnya, Anda memiliki ruang nama A dan ruang nama B dan ruang nama BA jika saya menulis kode di ruang nama BA yang perlu mereferensikan kelas di ruang nama A, tanpa global :: Saya tidak punya cara untuk mendapatkannya. Jika saya mereferensikan A.classname, kompilator akan mencari classname di BA Dengan global :: Saya dapat memberitahukannya untuk mencari classname dalam global :: A.classname dan ia akan menemukan classname di lokasi yang tepat.


15
Jika Anda mengambil konten dari sumber online, mohon berbaik hati memberikan atribusi yang tepat: MSDN dan Apa kata kunci global dalam C #
Bart

3
k .. @ Bart terima kasih atas komentar Anda Saya akan mengingatnya ketika saya menjawab lain kali .. Tapi mengapa downvote itu?
kode

3

The global::namespace dan identifier adalah bukan apa yang kebanyakan orang berpikir. Ini bukan pengenal universal untuk semua yang dibuat dalam aplikasi yang berada di luar salah satu ruang nama yang ditentukan aplikasi Anda dan yang dilampirkan ke beberapa root global.

Jika Anda membuat kelas atau mengetik di luar ruang nama tingkat atas, Anda akan menganggapnya secara otomatis sebagai bagian dari ruang nama GLOBAL dan dapat diakses oleh global::pengenal di semua file di aplikasi atau rakitan Anda. Faktanya, nama-nama itu lebih sering hanya ada dalam lingkup LOKAL yang dikompilasi file itu, namun dapat diakses melalui global::pengenal.

Jika Anda membuat kelas tingkat atas atau namespace dalam file aspx.cs itu dapat diakses melalui global::dari namespace global di file itu. Tetapi jika Anda mengetik global::di file lain, kelas dan namespace itu tidak ada di namespace global. Namun, jika Anda membuat kelas atau namespace yang sama dalam file class.cs, item tersebut tersedia untuk semua file lain melalui global::dan di namespace global serta file lingkup lokal tersebut. Mengapa?

Ternyata global::benar-benar merupakan referensi ke nama LOKAL tingkat atas di bawah cakupan file serta nama GLOBAL yang dibagikan oleh rakitan (seperti yang mungkin dikompilasi dalam file kelas App_Code Anda dalam proyek ASP.NET khas).

Saya menemukan ini sangat membingungkan dan tidak konsisten, karena global::menyiratkan akses ke ruang nama tingkat atas dan jenis yang dibuat dalam aplikasi yang terkait dengan ruang nama global. Beberapa seperti "Sistem" terikat ke ruang nama global secara default di semua file, tetapi yang khusus mungkin atau mungkin tidak tergantung pada ruang lingkup file itu. Itulah mengapa pengenal global memiliki peran sekunder untuk menyelesaikan referensi ke nama cakupan root lokal Anda juga.

Anda dapat mengujinya dengan membuat namespace dan class tingkat atas di beberapa bagian aplikasi Anda, lalu menggunakan global::untuk melihat mana yang dapat diaksesnya di namespace global dari berbagai bagian aplikasi Anda dan mana yang tidak bisa. Yang tidak dapat diakses dengan jelas ditetapkan ke "cakupan global lokal" hanya dalam file itu, yang global::membantu Anda mengakses dalam konflik penamaan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.