Trong C #, tôi thấy global::
được sử dụng khá thường xuyên trong mã được tạo tự động. Nó không phải là thứ mà bản thân tôi đã từng sử dụng nên tôi không biết mục đích là gì. Ai đó có thể giải thích điều này?
Trong C #, tôi thấy global::
được sử dụng khá thường xuyên trong mã được tạo tự động. Nó không phải là thứ mà bản thân tôi đã từng sử dụng nên tôi không biết mục đích là gì. Ai đó có thể giải thích điều này?
Câu trả lời:
global đề cập đến không gian tên chung, nó có thể được sử dụng để giải quyết các vấn đề, nhờ đó bạn có thể xác định lại các loại. Ví dụ:
class foo
{
class System
{
}
}
Nếu bạn đang sử dụng Hệ thống trong đó nó sẽ được xác định phạm vi cục bộ trong lớp foo, bạn có thể sử dụng:
global::System.Console.WriteLine("foobar");
để truy cập không gian tên chung.
Thí dụ
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
}
}
}
Đó là một tiền tố cần thiết đôi khi chỉ ra không gian tên gốc.
Nó thường được thêm vào mã được tạo để tránh xung đột tên với mã người dùng.
Ví dụ, hãy tưởng tượng bạn có một lớp được gọi System
, nhưng sau đó bạn muốn sử dụng System.String
. Bạn có thể sử dụng global::System.String
để phân biệt.
Tôi tin rằng nó ::
đến từ C ++, nơi nó được sử dụng như một dấu phân cách không gian tên.
Trong thực tế, tôi chưa bao giờ sử dụng nó, ngoài việc tạo mã. Lưu ý rằng bạn cũng có thể gặp một số xung đột bằng cách sử dụng bí danh. Ví dụusing String = System.String;
Các global
từ khóa theo ngữ cảnh, khi nói trước :: operator, đề cập đến không gian tên toàn cầu, đó là không gian tên mặc định cho bất kỳ chương trình C # và là khác giấu tên.
Bộ global::
chỉ định yêu cầu trình biên dịch bắt đầu tìm kiếm không gian tên hoặc lớp bắt đầu từ gốc. Bạn sẽ thấy nó trong mã do hệ thống tạo để mã luôn hoạt động. Bằng cách đó, nếu bạn có một không gian tên ngay dưới không gian tên hiện tại của bạn giống với không gian tên cấp cao nhất mà mã đang cố gắng truy cập, sẽ không có xung đột.
Ví dụ: giả sử bạn có không gian tên A và không gian tên B và không gian tên BA nếu tôi viết mã trong không gian tên BA cần tham chiếu đến một lớp trong không gian tên A, không có toàn cục :: Tôi không có cách nào truy cập được. Nếu tôi tham chiếu A.classname, trình biên dịch sẽ tìm kiếm tên lớp trong BA Với global :: Tôi có thể yêu cầu nó tìm kiếm tên lớp trong global :: A.classname và nó sẽ tìm tên lớp ở vị trí thích hợp.
Không global::
gian tên và định danh của nó không phải là những gì hầu hết mọi người nghĩ. Nó không phải là định danh chung của mọi thứ được tạo trong ứng dụng mà nằm ngoài một trong các không gian tên đã xác định của ứng dụng của bạn và được gắn với một số gốc chung.
Nếu bạn tạo một lớp hoặc kiểu bên ngoài không gian tên cấp cao nhất của mình, bạn sẽ tự động coi nó là một phần của không gian tên TOÀN CẦU và có thể truy cập bằng mã global::
định danh trong tất cả các tệp trong ứng dụng hoặc tổ hợp của bạn. Trên thực tế, những tên đó thường chỉ nằm trong phạm vi ĐỊA PHƯƠNG đã biên dịch của tệp đó, nhưng vẫn có thể truy cập được thông qua global::
định danh.
Nếu bạn tạo một lớp cấp cao nhất hoặc không gian tên trong tệp aspx.cs, nó có thể truy cập được global::
từ không gian tên chung trong tệp đó. Nhưng nếu bạn nhập global::
vào một tệp khác, lớp và không gian tên đó không tồn tại trong không gian tên chung. Tuy nhiên, nếu bạn tạo cùng một lớp hoặc không gian tên đó trong tệp class.cs, các mục đó sẽ có sẵn cho tất cả các tệp khác thông qua global::
và trong không gian tên chung cũng như phạm vi cục bộ tệp đó. Tại sao?
Nó global::
thực sự là một tham chiếu đến các tên ĐỊA PHƯƠNG cấp cao nhất trong phạm vi của tệp cũng như các tên TOÀN CẦU được chia sẻ bởi hội đồng (giống như những gì có thể được biên dịch trong tệp lớp App_Code của bạn trong một dự án ASP.NET điển hình).
Tôi thấy điều này rất khó hiểu và không nhất quán, vì global::
ngụ ý quyền truy cập vào không gian tên cấp cao nhất và các loại được tạo trong ứng dụng được gắn với không gian tên chung. Một số như "Hệ thống" được gắn với không gian tên chung theo mặc định trong tất cả các tệp, nhưng các tùy chỉnh có thể có hoặc không tùy thuộc vào phạm vi của tệp đó. Đó là lý do tại sao mã định danh toàn cầu cũng có vai trò phụ là giải quyết các tham chiếu đến tên phạm vi gốc cục bộ của bạn.
Bạn có thể kiểm tra điều này bằng cách tạo các lớp và không gian tên cấp cao nhất trong các phần của ứng dụng, sau đó sử dụng global::
để xem những lớp nào nó có thể truy cập trong không gian tên chung từ các phần khác nhau của ứng dụng và những lớp nào nó không thể. Cái mà nó không thể truy cập được chỉ định rõ ràng cho "phạm vi toàn cầu cục bộ" trong tệp đó, điều này global::
giúp bạn truy cập trong xung đột đặt tên.