ใน C # ฉันเห็นว่า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คำหลักตามบริบทเมื่อมันมาก่อน :: ผู้ประกอบการหมายถึง namespace โลกซึ่งเป็น namespace เริ่มต้นสำหรับโปรแกรมใด ๆ C # และเป็นชื่ออย่างอื่น
ตัวglobal::ระบุจะบอกคอมไพลเลอร์ให้เริ่มค้นหาเนมสเปซหรือคลาสโดยเริ่มจากรูท คุณจะเห็นรหัสนี้ในโค้ดที่ระบบสร้างขึ้นเพื่อให้โค้ดทำงานได้เสมอ ด้วยวิธีนี้หากคุณมีเนมสเปซที่ถูกต้องภายใต้เนมสเปซปัจจุบันของคุณซึ่งเหมือนกับเนมสเปซระดับบนสุดที่โค้ดพยายามเข้าถึงจะไม่มีข้อขัดแย้ง
ตัวอย่างเช่นสมมติว่าคุณมีเนมสเปซ A และเนมสเปซ B และเนมสเปซ BA ถ้าฉันเขียนโค้ดในเนมสเปซ BA ที่ต้องอ้างอิงคลาสในเนมสเปซ A โดยไม่มี global :: ฉันไม่มีทางไปถึงมันได้ ถ้าฉันอ้างอิง A.classname คอมไพเลอร์จะมองหา classname ใน BA ด้วย global :: ฉันบอกได้ว่าให้มองหา classname ใน global :: A.classname และจะพบ classname ในตำแหน่งที่เหมาะสม
global::namespace และตัวระบุไม่ได้เป็นสิ่งที่คนส่วนใหญ่คิดว่า ไม่ใช่ตัวระบุสากลของทุกสิ่งที่สร้างขึ้นในแอปพลิเคชันที่อยู่นอกเนมสเปซที่กำหนดไว้ในแอปพลิเคชันของคุณและที่แนบมากับรูทส่วนกลางบางส่วน
หากคุณสร้างคลาสหรือพิมพ์นอกเนมสเปซระดับบนสุดของคุณคุณจะถือว่ามันเป็นส่วนหนึ่งของเนมสเปซ GLOBAL โดยอัตโนมัติและglobal::ตัวระบุสามารถเข้าถึงได้ในไฟล์ทั้งหมดในแอปพลิเคชันหรือแอสเซมบลีของคุณ ในความเป็นจริงชื่อเหล่านี้มักจะอยู่ในขอบเขต LOCAL ที่คอมไพล์ของไฟล์นั้นเท่านั้น แต่ยังสามารถเข้าถึงได้ผ่านglobal::ตัวระบุ
หากคุณสร้างคลาสระดับบนสุดหรือเนมสเปซในไฟล์ aspx.cs จะสามารถเข้าถึงได้global::จากเนมสเปซส่วนกลางในไฟล์นั้น แต่ถ้าคุณพิมพ์global::ไฟล์อื่นคลาสและเนมสเปซนั้นจะไม่มีอยู่ในเนมสเปซส่วนกลาง หากคุณสร้างคลาสหรือเนมสเปซเดียวกันในไฟล์ class.cs ไอเท็มเหล่านี้จะพร้อมใช้งานสำหรับไฟล์อื่น ๆ ทั้งหมดผ่านglobal::และในเนมสเปซส่วนกลางรวมทั้งไฟล์ขอบเขตโลคัล ทำไม?
ปรากฎว่าglobal::เป็นการอ้างอิงถึงชื่อ LOCAL ระดับบนสุดภายใต้ขอบเขตของไฟล์เช่นเดียวกับชื่อ GLOBAL ที่ใช้ร่วมกันโดยแอสเซมบลี (เช่นสิ่งที่อาจรวบรวมในไฟล์คลาส App_Code ของคุณในโครงการ ASP.NET ทั่วไป)
ฉันพบว่าสิ่งนี้สับสนและไม่สอดคล้องกันมากเนื่องจากglobal::แสดงถึงการเข้าถึงเนมสเปซระดับบนสุดและประเภทที่สร้างขึ้นในแอปพลิเคชันที่เชื่อมโยงกับเนมสเปซส่วนกลาง บางอย่างเช่น "ระบบ" จะเชื่อมโยงกับเนมสเปซส่วนกลางโดยค่าเริ่มต้นในไฟล์ทั้งหมด แต่ไฟล์ที่กำหนดเองอาจมีหรือไม่ก็ได้ขึ้นอยู่กับขอบเขตของไฟล์นั้น นั่นคือเหตุผลที่ตัวระบุส่วนกลางมีบทบาทรองในการแก้ไขการอ้างอิงถึงชื่อขอบเขตรูทโลคัลของคุณด้วย
คุณสามารถทดสอบสิ่งนี้ได้โดยสร้างเนมสเปซระดับบนสุดและคลาสในบางส่วนของแอปพลิเคชันของคุณจากนั้นใช้global::เพื่อดูว่าแอปพลิเคชันใดที่สามารถเข้าถึงได้ในเนมสเปซส่วนกลางจากส่วนต่างๆของแอปพลิเคชันของคุณและส่วนใดที่ไม่สามารถเข้าถึงได้ สิ่งที่ไม่สามารถเข้าถึงได้ถูกกำหนดอย่างชัดเจนให้กับ "ขอบเขตส่วนกลางภายใน" ในไฟล์นั้นเท่านั้นซึ่งglobal::ช่วยให้คุณเข้าถึงข้อขัดแย้งในการตั้งชื่อได้