global คืออะไร ::?


116

ใน C # ฉันเห็นว่าglobal::ใช้บ่อยในรหัสที่สร้างขึ้นโดยอัตโนมัติ ไม่ใช่ของที่เคยใช้เองเลยไม่รู้ว่าจุดประสงค์คืออะไร ใครช่วยอธิบายเรื่องนี้ได้ไหม?



2
จากmsdn
Sina Iravanian

คำตอบ:


104

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

จะเกิดอะไรขึ้นถ้าฉันมีคลาสที่สร้างขึ้นโดยอัตโนมัติโดยมีคลาสที่นำหน้าด้วยเนมสเปซส่วนกลางและคลาสนั้นชื่อว่า Foo ฉันมีคลาสที่ฉันสร้างขึ้นซึ่งเรียกอีกอย่างว่า Foo โดยไม่มีเนมสเปซ
Sachin Kainth

ถ้าคลาสที่สร้างขึ้นโดยอัตโนมัติถูกนำหน้าด้วยเนมสเปซส่วนกลางและถูกเรียกว่า Foo global จะอ้างถึงคลาสในเนมสเปซส่วนกลาง สามารถมีได้เพียงคำจำกัดความเดียวที่มีชื่อเดียวกันในเนมสเปซใด ๆ หากคุณจะสร้างอินสแตนซ์ของคลาสจากภายในเนมสเปซอื่นโดยที่คุณกำหนดความหมายอื่นสำหรับ Foo จะต้องใช้ขอบเขตท้องถิ่นมากที่สุด ดูการแก้ไข
chrisw

26

เป็นคำนำหน้าที่จำเป็นในบางครั้งเพื่อระบุเนมสเปซรูท

มักจะเพิ่มลงในโค้ดที่สร้างขึ้นเพื่อหลีกเลี่ยงการขัดแย้งชื่อกับรหัสผู้ใช้

ตัวอย่างเช่นสมมติว่าคุณได้ระดับที่เรียกว่าแต่แล้วคุณต้องการที่จะใช้System System.Stringคุณสามารถใช้global::System.Stringเพื่อแยกความแตกต่าง

ฉันเชื่อว่า::มาจาก C ++ ซึ่งใช้เป็นตัวคั่นเนมสเปซ

ในทางปฏิบัติฉันไม่เคยใช้มันเลยนอกจากในการสร้างโค้ด โปรดทราบว่าคุณสามารถหลีกเลี่ยงความขัดแย้งบางอย่างได้โดยใช้นามแฝง ตัวอย่างเช่นusing String = System.String;


14

globalคำหลักตามบริบทเมื่อมันมาก่อน :: ผู้ประกอบการหมายถึง namespace โลกซึ่งเป็น namespace เริ่มต้นสำหรับโปรแกรมใด ๆ C # และเป็นชื่ออย่างอื่น

ตัวglobal::ระบุจะบอกคอมไพลเลอร์ให้เริ่มค้นหาเนมสเปซหรือคลาสโดยเริ่มจากรูท คุณจะเห็นรหัสนี้ในโค้ดที่ระบบสร้างขึ้นเพื่อให้โค้ดทำงานได้เสมอ ด้วยวิธีนี้หากคุณมีเนมสเปซที่ถูกต้องภายใต้เนมสเปซปัจจุบันของคุณซึ่งเหมือนกับเนมสเปซระดับบนสุดที่โค้ดพยายามเข้าถึงจะไม่มีข้อขัดแย้ง

ตัวอย่างเช่นสมมติว่าคุณมีเนมสเปซ A และเนมสเปซ B และเนมสเปซ BA ถ้าฉันเขียนโค้ดในเนมสเปซ BA ที่ต้องอ้างอิงคลาสในเนมสเปซ A โดยไม่มี global :: ฉันไม่มีทางไปถึงมันได้ ถ้าฉันอ้างอิง A.classname คอมไพเลอร์จะมองหา classname ใน BA ด้วย global :: ฉันบอกได้ว่าให้มองหา classname ใน global :: A.classname และจะพบ classname ในตำแหน่งที่เหมาะสม


15
หากคุณรับเนื้อหาจากแหล่งข้อมูลออนไลน์โปรดระบุแหล่งที่มาที่เหมาะสม: MSDNและคำหลักสากลใน C # คืออะไร
บาร์ต

3
k .. @ Bart ขอบคุณสำหรับความคิดเห็นของคุณฉันจะจำไว้เสมอเมื่อฉันตอบครั้งต่อไป .. แต่ทำไมถึงโหวตลง?
coder

3

global::namespace และตัวระบุไม่ได้เป็นสิ่งที่คนส่วนใหญ่คิดว่า ไม่ใช่ตัวระบุสากลของทุกสิ่งที่สร้างขึ้นในแอปพลิเคชันที่อยู่นอกเนมสเปซที่กำหนดไว้ในแอปพลิเคชันของคุณและที่แนบมากับรูทส่วนกลางบางส่วน

หากคุณสร้างคลาสหรือพิมพ์นอกเนมสเปซระดับบนสุดของคุณคุณจะถือว่ามันเป็นส่วนหนึ่งของเนมสเปซ GLOBAL โดยอัตโนมัติและglobal::ตัวระบุสามารถเข้าถึงได้ในไฟล์ทั้งหมดในแอปพลิเคชันหรือแอสเซมบลีของคุณ ในความเป็นจริงชื่อเหล่านี้มักจะอยู่ในขอบเขต LOCAL ที่คอมไพล์ของไฟล์นั้นเท่านั้น แต่ยังสามารถเข้าถึงได้ผ่านglobal::ตัวระบุ

หากคุณสร้างคลาสระดับบนสุดหรือเนมสเปซในไฟล์ aspx.cs จะสามารถเข้าถึงได้global::จากเนมสเปซส่วนกลางในไฟล์นั้น แต่ถ้าคุณพิมพ์global::ไฟล์อื่นคลาสและเนมสเปซนั้นจะไม่มีอยู่ในเนมสเปซส่วนกลาง หากคุณสร้างคลาสหรือเนมสเปซเดียวกันในไฟล์ class.cs ไอเท็มเหล่านี้จะพร้อมใช้งานสำหรับไฟล์อื่น ๆ ทั้งหมดผ่านglobal::และในเนมสเปซส่วนกลางรวมทั้งไฟล์ขอบเขตโลคัล ทำไม?

ปรากฎว่าglobal::เป็นการอ้างอิงถึงชื่อ LOCAL ระดับบนสุดภายใต้ขอบเขตของไฟล์เช่นเดียวกับชื่อ GLOBAL ที่ใช้ร่วมกันโดยแอสเซมบลี (เช่นสิ่งที่อาจรวบรวมในไฟล์คลาส App_Code ของคุณในโครงการ ASP.NET ทั่วไป)

ฉันพบว่าสิ่งนี้สับสนและไม่สอดคล้องกันมากเนื่องจากglobal::แสดงถึงการเข้าถึงเนมสเปซระดับบนสุดและประเภทที่สร้างขึ้นในแอปพลิเคชันที่เชื่อมโยงกับเนมสเปซส่วนกลาง บางอย่างเช่น "ระบบ" จะเชื่อมโยงกับเนมสเปซส่วนกลางโดยค่าเริ่มต้นในไฟล์ทั้งหมด แต่ไฟล์ที่กำหนดเองอาจมีหรือไม่ก็ได้ขึ้นอยู่กับขอบเขตของไฟล์นั้น นั่นคือเหตุผลที่ตัวระบุส่วนกลางมีบทบาทรองในการแก้ไขการอ้างอิงถึงชื่อขอบเขตรูทโลคัลของคุณด้วย

คุณสามารถทดสอบสิ่งนี้ได้โดยสร้างเนมสเปซระดับบนสุดและคลาสในบางส่วนของแอปพลิเคชันของคุณจากนั้นใช้global::เพื่อดูว่าแอปพลิเคชันใดที่สามารถเข้าถึงได้ในเนมสเปซส่วนกลางจากส่วนต่างๆของแอปพลิเคชันของคุณและส่วนใดที่ไม่สามารถเข้าถึงได้ สิ่งที่ไม่สามารถเข้าถึงได้ถูกกำหนดอย่างชัดเจนให้กับ "ขอบเขตส่วนกลางภายใน" ในไฟล์นั้นเท่านั้นซึ่งglobal::ช่วยให้คุณเข้าถึงข้อขัดแย้งในการตั้งชื่อได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.