Cơ sở hạ tầng .NET Common Language có hai khái niệm khác nhau:
- Namespaces: Tiền tố cho tên kiểu như
System.Drawing
, được sử dụng để phân biệt nhiều loại mà nếu không sẽ có cùng tên.
- Assemblies: Thư viện mã có thể được triển khai, cài đặt và được phiên bản riêng biệt với các hội đồng khác. Các loại trong một hội đồng có thể ở bất kỳ số lượng không gian tên nào.
Namespaces tạo thành một hệ thống phân cấp dựa trên đầy đủ-stop (dot) tách - vì vậy bạn có nghĩa là để nghĩ rằng các loại trong không gian tên System.Runtime.InteropServices
là phụ thuộc vào những người thân trong không gian tên System.Runtime
. Tuy nhiên, theo như tôi biết, CLI không quan tâm đến tên hoặc phân cấp của các không gian tên của bạn, ngoại trừ trong trường hợp chúng làm cho tên của bạn trở nên độc đáo. Hơn nữa, một assembly có thể chứa các kiểu từ nhiều không gian tên, thậm chí cả những cái trong các hệ thống phân cấp khác nhau, và một vùng tên duy nhất có thể chứa các kiểu được định nghĩa trong nhiều assembly. Nếu bạn xem tài liệu MSDN cho một kiểu trong thư viện .NET, nó sẽ cho bạn biết loại assembly nào đang ở. Tuy nhiên, as Paolo Falabella has pointed out, MSDN sẽ không cho bạn biết không gian tên nào được lắp ráp, bởi vì một vùng tên duy nhất có thể chứa các kiểu từ nhiều hội đồng.
Trong trường hợp của bạn: mscorlib
là một hội đồng định nghĩa một số loại trong không gian tên System
và nhiều loại khác, chẳng hạn như System.Runtime.InteropServices
, như bạn đã lưu ý. Tuy nhiên, các loại bạn đang sử dụng trong không gian tên System.Drawing
được đặt trong hội đồng System.Drawing
.
Vì hội đồng là đơn vị triển khai mã và sử dụng lại, Visual Studio dự án tham chiếu hội đồng, không phải không gian tên, và vì vậy bạn phải thêm tham chiếu đến System.Drawing assembly trong dự án Visual Studio cho chương trình của bạn.
The VB.NET Imports
statement (và tương đương C#, using
directive) cho phép bạn tham chiếu các loại trong không gian tên mà không phải nhập tên không gian tên mỗi lần. Tức là, với Imports System.Drawing
, bạn có thể viết Graphics
trong mã của mình thay vì System.Drawing.Graphics
. Nhưng đó là tất cả câu lệnh Nhập khẩu thực hiện. Cụ thể:
Imports System
không tự động tạo tham chiếu dự án cho mọi hội đồng trên thế giới xảy ra để xác định loại trong không gian tên Hệ thống.
Imports mscorlib
không có nghĩa là bạn tham chiếu mọi loại trong cụm "mscorlib" theo tên ngắn của nó. Điều đó có nghĩa là bạn có thể tham chiếu các loại trong không gian tên "mscorlib" bằng tên ngắn của chúng, không chỉ hoàn toàn khác nhau mà rất khó có thể là thứ bạn muốn.
Dòng dưới cùng: nếu bạn muốn truy cập GDI +, thì bạn sử dụng các loại trong không gian tên System.Drawing, nhưng tên đó không liên quan đến tên của hội đồng GDI +. Microsoft đã chọn tên "System.Drawing" cho assembly có chứa các kiểu GDI +, nhưng nó có thể đã chọn "gdiplus-cli", "gdi-for-dotnet", hoặc thậm chí là "Frobinator". Dù cái tên mà assembly đó có, bạn phải thêm một tham chiếu đến assembly đó. Và bạn không làm điều đó trong mã nguồn của bạn - you add assembly references in your Visual Studio project configuration.
MSDN has an outdated but still good description of assemblies, namespaces, and the differences between them, which you may find helpful.
Vì vậy, nếu tôi hiểu chính xác, 'Hệ thống nhập' sẽ kéo vào tất cả các assembly xác định toàn bộ không gian tên' System'. Mặt khác, 'import mscorlib' sẽ chỉ kéo vào phần mà assembly của nó được định nghĩa. – mdinger
KHÔNG! Câu lệnh Imports chỉ hoạt động với các không gian tên. Nó biết * không có gì * về hội đồng. Tôi sẽ chỉnh sửa câu trả lời của tôi để giải thích điều này. –
Đó là một sự phân biệt nhập khẩu mà làm cho rất nhiều ý nghĩa.Trước khi bạn giải thích điều này, tôi đã có thể nói rằng tài liệu tham khảo làm cho nguồn lực có sẵn để được nhập khẩu bằng cách cho các vị trí tập tin tài nguyên; tuy nhiên, tài nguyên chỉ có thể được truy cập thông qua câu lệnh 'Imports'. Cảm ơn bạn đã nỗ lực. Trước đây tôi thấy họ rất khó hiểu và không rõ ràng. Bây giờ việc tham khảo và nhập khẩu có ý nghĩa hơn nhiều. – mdinger