2013-02-22 35 views
67

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à một cái gì đó tôi đã từng sử dụng bản thân mình vì vậy tôi không biết mục đích là gì. Ai đó có thể giải thích điều này?Toàn cầu là gì ::?

+1

http://stackoverflow.com/questions/3552763/why-use-global-keyword-in-net –

+2

Từ msdn: http://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx –

Trả lời

59

toàn cầu đề cập đến không gian tên chung, nó có thể được sử dụng để giải quyết các vấn đề theo đó bạn có thể xác định lại các loại. Ví dụ:

class foo 
{ 
    class System 
    { 

    } 

} 

Nếu bạn đã sử dụng hệ thống, nơi nó sẽ được scoped cục bộ trong lớp foo, bạn có thể sử dụng:

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

để truy cập namespace toàn cầu.

Ví 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 
     } 
    } 
} 
+0

Điều gì sẽ xảy ra nếu tôi có một lớp được tạo tự động với một lớp được đặt trước với không gian tên chung và lớp được gọi là Foo Tôi đã có một lớp mà tôi đã tạo ra mà còn được gọi là Foo cũng không có không gian tên? –

+0

Nếu lớp được tạo tự động được đặt trước với không gian tên chung và được gọi là Foo, toàn cầu sẽ tham chiếu đến lớp trong không gian tên chung. Chỉ có thể có một định nghĩa duy nhất có cùng tên trong bất kỳ không gian tên nào. Nếu bạn đã tạo một thể hiện của lớp từ bên trong một không gian tên khác, theo đó bạn đã định nghĩa một ý nghĩa khác cho Foo, nó sẽ có phạm vi cục bộ nhất. Xem chỉnh sửa – chrisw

17

Đó là tiền tố đôi khi cần thiết cho biết 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ụ: giả sử bạn có một lớp được gọi là 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 :: xuất phát từ C++, nơi được sử dụng làm bộ phân tá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;

12

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.

Trình chỉ định global:: 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 như 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 B.A nếu tôi viết mã trong không gian tên B.A cần tham chiếu đến một lớp trong không gian tên A, không có global :: Tôi không có cách nào để lấy nó. 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 B.A. Với toàn cầu :: Tôi có thể yêu cầu nó tìm kiếm classname trong global :: A.classname và nó sẽ tìm thấy classname ở vị trí thích hợp.

+12

Nếu bạn lấy nội dung từ tài nguyên trực tuyến, vui lòng cung cấp phân bổ phù hợp: [MSDN] (http://msdn.microsoft).com/en-us/library/cc713620.aspx) và [Từ khóa chung trong C#] là gì (http://blog.dmbcllc.com/what-is-the-global-keyword-in-csharp/) – Bart

+2

k .. @ Bart cảm ơn cho bình luận của bạn Tôi sẽ ghi nhớ khi tôi đang trả lời nexttime .. Nhưng tại sao là downvote? – coder

+0

Đó không phải của tôi. – Bart

Các vấn đề liên quan