2012-01-26 35 views
14

Xin lỗi nếu câu hỏi này đã được hỏi. Tôi bắt đầu nghiên cứu C# và nhận thấy rằng C# không tự động nhập các vùng tên lồng nhau. Tôi không hiểu:Nhập tự động không gian tên lồng nhau trong C#

using System; 

sẽ tự động nhập tất cả các lớp có trong không gian tên Hệ thống phải không? Vì vậy, không nên có nhu cầu cho tôi để viết

using System.Windows.Form; 

tôi sẽ hiểu nếu using Windows.Form thậm chí làm việc. Nhưng trình biên dịch không thể giải quyết nó! Điểm số của using System; trước đó là gì? Vậy tại sao using System; không nhập System.Windows tự động cũng như System.Windows.Forms - xin lỗi nếu từ nhập sai ở đây .. có thể di chuyển đến không gian tên chung là thuật ngữ đúng.

+3

C# không hoạt động như vậy, trong Java, bạn có thể nhập không gian tên bằng ký tự đại diện, nhưng vì lý do gì đó, các nhà thiết kế C# chọn không làm điều đó. Tôi không chắc nó mang tính xây dựng để tranh luận tại sao. – CodingGorilla

+2

Closters - đây là một câu hỏi hợp pháp. – Oded

+1

@CodingGorilla: "Tại sao" không phải là một cuộc tranh luận; có một lý do rõ ràng (tức là, như Oded đã nói, rằng các không gian tên C# là hợp lý, không phải nhóm vật lý). – Brian

Trả lời

18

C# không phải là Java.

A using directive được sử dụng để bạn không phải nhập tên đủ điều kiện của loại. Nó cũng giúp định nghĩa các tên kiểu (ví dụ sử dụng bí danh).

Trong trường hợp Console, ví dụ: bạn không cần nhập System.Console.

Điều quan trọng là phải hiểu sự khác biệt giữa không gian tên và lắp ráp - một không gian tên là một nhóm hợp lý. Hội đồng là một nhóm các loại vật lý. Không gian tên có thể mở rộng hội đồng.

Khi bạn tham khảo một hội đồng (đây là giống như nhập khẩu một gói trong Java), bạn truy cập vào tất cả các trong những loại nào trong đó. Để sử dụng một loại, bạn cần xác định duy nhất nó. Điều này được thực hiện thông qua không gian tên - chỉ thị using chỉ đơn giản có nghĩa là bạn không phải nhập tên đủ điều kiện của loại.

+0

Vì vậy, việc sử dụng sẽ nhập tất cả các lớp trong không gian tên hiện tại, nhưng khi nó truy cập vào một không gian tên lồng nhau, nó bỏ qua nó? Trừ khi tôi xác định rõ ràng nó .. đó là điểm? –

+0

@LewsTherin - Nó không phải là "bỏ qua" nó.Bạn chỉ đơn giản là không chỉ định "phím tắt". Chỉ thị 'using' được sử dụng, do đó bạn không phải chỉ định" đường dẫn "đầy đủ cho loại. Bạn có thể truy cập loại bằng cách sử dụng đường dẫn đầy đủ đến nó nếu bạn muốn, nhưng có chỉ thị 'using' chỉ đảm bảo bạn không phải nhập nhiều ... – Oded

+0

Thêm tham chiếu đến assembly có nghĩa là" nạp tất cả các loại từ assembly này để mặc định AppDomain ", bằng cách sử dụng' using' chỉ thị bạn chỉ cần nói với mã của bạn mà các loại là _visible_ vào lúc này. – Restuta

11

Chỉ thị sử dụng có hai công dụng:

Cho phép sử dụng các loại trong một không gian tên do đó bạn không cần phải đủ điều kiện sử dụng của một loại trong namespace rằng:

sử dụng System.Text;

Để tạo bí danh cho không gian tên hoặc loại. này được gọi là chỉ thị bí danh sử dụng.

sử dụng Project = PC.MyCompany.Project;

http://msdn.microsoft.com/en-us/library/sf0df423.aspx

Tuy nhiên, bạn phải lưu ý hệ thống đó và System.Windows.Form are not connected qua tên chính nó trong anyway. Nếu bạn nhập (sử dụng) Hệ thống có nghĩa là bạn sẽ sử dụng các kiểu lắp ráp Hệ thống trong lớp này. Tham chiếu thực tế bạn chỉ định trong phần tham chiếu trong dự án Visual Studio mà bạn thực sự có thể sử dụng (ngay cả khi không sử dụng câu lệnh vì đây chỉ là phím tắt cho các loại).

+0

+1. Điểm tốt - C# cho phép các không gian tên được phân chia trên các assembly, vì vậy dự án của bạn có thể không được nhập khẩu (hoặc muốn import) các assembly khác. – TrueWill

+0

Tôi chỉ nhận ra mình bối rối thế nào. Tôi tiếp tục nhầm lẫn khi sử dụng khi nhập? Và tôi cho rằng chúng phải là những thứ khác nhau .. Liệu C# không nhập tất cả các lớp? Tôi biết C++ và Java không .. –

+1

@LewsTherin - Trong .NET bạn thêm một _reference_ vào một assembly có chứa các kiểu mà bạn muốn "import". – Oded

4

C# không nhập các vùng tên lồng nhau và điều này là do thiết kế.

Phạm vi không gian cho phép bạn sắp xếp mã và cung cấp cho bạn cách tạo các loại duy nhất trên toàn cầu.

Không gian tên lồng nhau được sử dụng để nhóm chức năng liên quan, nhưng sử dụng các bộ phận theo yêu cầu.

Tôi đoán bạn sẽ không muốn có tất cả các loại từ một không gian tên lớn như System nếu điều duy nhất bạn cần là System.Windows.

Vì vậy, có lẽ câu hỏi là tại sao C# không có thứ gì giống như using System.*; như java. Tôi không biết câu trả lời, nhưng tôi đoán điều này là do nguyên tắc của KISS. Đó là một cái gì đó như sử dụng

select *

bạn sẽ không bao giờ biết những gì loại bạn sẽ thêm và làm thế nào họ sẽ ảnh hưởng đến mã hiện.

1

Ngay cả trong Java bạn phải viết một cách rõ ràng

import System.*; 

Phần lớn thời gian bạn không muốn tất cả các namespace lồng nhau. Đây sẽ chỉ đơn giản là lộn xộn IntelliSense.

0

"Sử dụng" không gian tên đã cho nghĩa là bạn sẽ có quyền truy cập vào tất cả các định nghĩa được triển khai trực tiếp trong đó, chứ không phải theo cách đệ quy tra cứu các không gian tên được nhúng; làm theo cách khác sẽ đánh bại mục đích của câu lệnh "Sử dụng".

Không gian tên tồn tại để tránh sự mơ hồ về tên lớp. Câu lệnh "Sử dụng" ở đây để tránh sử dụng các loại đủ điều kiện được lồng trong không gian tên, khi bạn biết không có (hoặc ít) sự mơ hồ có thể xảy ra.

1

Cú pháp "sử dụng" cho phép bạn viết tắt quyền truy cập vào các không gian tên đã được liệt kê dưới dạng Tham chiếu trong cài đặt dự án. Nếu không gian tên được liệt kê dưới dạng tham chiếu, bạn đã có quyền truy cập vào nó bằng tên đầy đủ của nó mà không có chỉ thị "đang sử dụng". Chỉ cần lưu tổ hợp phím.

0

Không, đây không phải là cách hoạt động.

Và tôi sẽ đưa ra một tranh luận tốt chống lại những gì bạn nói: intellisnse sẽ phát điên và tìm thấy những gì bạn muốn là địa ngục.

Bạn có quyền truy cập mọi thứ trên mọi không gian tên có sẵn (với dấu chấm), từ khóa using đơn giản hóa điều này vì bạn không phải chỉ định từ không gian tên nào mà lớp hoặc cấu trúc "đến từ" (ý tôi là, đã xác định) .

+0

Tôi sẽ không căn cứ vào một tính năng trong lựa chọn của bạn của trình soạn thảo (ví dụ: một với intellisense). Tôi sẽ thiết kế một tính năng chỉ với các trình soạn thảo đơn giản nhất (ví dụ: notepad.exe). –

+0

Để tránh phụ thuộc vào trình soạn thảo, tôi có thể tạo một đối số tương tự cho trình biên dịch: biên dịch sẽ khó hơn nhiều vì mọi thứ bạn sử dụng không được định nghĩa cục bộ, nó sẽ phải kiểm tra mọi cây con có thể của mỗi mô-đun bạn dùng. Ngoài khó khăn và lãng phí, điều này có thể gây ra rất nhiều xung đột tên. –

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