Namespace là gì trong C#
Namespace là cách tổ chức nhóm code (các lớp, giao diện, cấu trúc ...) thành những nhóm, tạo ra phạm vi hoạt động
của các thành phần trong nhóm. Nhìn lại chương trình đầu tiên mà dotnet
tạo ra:
using System; namespace CS001_HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Xin chào C# NET CORE!"); } } }
Bạn thấy, code trên có:
- Đã chỉ thị nạp một namespace vào để sử dụng cho file code,
đó là chỉ thị
using System;
. Điều này có nghĩa các thành phần (class, interface, enum ...) được định nghĩa trong namespaceSystem
sử dụng được trong code. Như lớp Console định nghĩa trongSystem
thì trong code đã truy cập được lớp này -Console.WriteLine("Xin chào C# NET CORE!");
- Đã định nghĩa một namespace mới có tên
CS001_HelloWorld
và trong namespace này định nghĩa một lớp có tênProgram
Như vậy: Namespace khai báo một phạm vi, nó chứa tập hợp các đối tượng liên quan nhau, nhằm mục đích tổ chức code khoa học, dễ quản lý và đặc biệt là tránh xung đột về tên. (bạn có thể khai báo hai lớp tên giống nhau nhưng nằm ở hai namespace khác nhau).
Cách khai báo tạo ra một namespace mới: sử dụng từ khóa namespace
và chỉ ra tên
namespace muốn tạo mới, các thành phần khai báo trong namespace này (class, interface, struct ...)
được định nghĩa trong khối {}
.
Ví dụ, khai báo tạo ra namespace có tên mynamespace
namespace mynamespace { // Định nghĩa các lớp, cấu trúc ... }
Một namespace bạn có thể định nghĩa ở nhiều file code (.cs) khác nhau.
Khi muốn sử dụng các thành phần của namespace nào đó, thì dùng từ khóa using
ở đầu file code để
chỉ thị nạp namespace này vào
using mynamespace; using mynamespace; ...
Namespace Systems;
là namepace cơ sở hệ thống của .NET, nên hầu như mọi chương trình
đều có đoạn code using Systems;
ở đầu.
Các thành phần được khai báo trong một namespace: namespace con, các lớp (class), các giao diện interface c#, các cấu trúc - struct C#, các liệt kê enum, các deleage C#
Namespace lồng nhau, nhiều cấp
Các namespace cũng có thể khai báo lồng nhau, nhiều cấp sau đó dùng ký hiệu .
để truy cập đến
namepace mong muốn, ví dụ namepace B nằm trong namspace A
namespace A { // Định nghĩa các lớp, cấu trúc ... namespace B { // Định nghĩa các lớp, cấu trúc ... } }
Khi đó muốn dùng các lớp, cấu trúc ... có trong namespace B thì khai báo
using A.B;
Thư viện .NET cung cấp rất nhiều namespace - mỗi namespace là tập hợp các lớp, cấu trúc về một vấn đề nào đó.
Tạo ra namespace nhiều cấp còn có thể khai báo một cách riêng rẽ nhưng phải chỉ rõ tên đầy đủ của namespace (tên namespace gốc)
Ví dụ, namespace C là con của namespace B, B lại là con của namespace A thì bạn có thể khai báo lồng nhau như trên hoặc:
namespace A { public struct StructInA {}; } namespace A.B { public struct StructInB {}; } namespace A.B.C { public struct StructInC {}; }
Cách khai báo này hoàn toàn giống:
namespace A { public struct StructInA { }; namespace B { public struct StructInB { }; namespace C { public struct StructInC { }; } } }
Truy cập namespace và từ khóa using
Để sử dụng một lớp, cấu trúc, interface ... khai báo trong một namespace nào đó, bạn phải viết tên đầy
đủ của namespace và dẫn đến tên lớp muốn sử dụng, các cấp phân cách nhau bởi ký tự .
Ví dụ, lớp StringBuilder
được định nghĩa trong namespace System.Text
,
vậy để dùng nó trong code bạn phải viết với tên đầy đủ System.Text.StringBuilder
:
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
Hoặc sử dụng StructInC
ở trên bạn phải viết:
A.B.C.StructInC mystruct;
Để tránh phải viết tên đầy đủ như vậy bạn sử dụng đến từ khóa using
với namespace cần dùng ở đầu.
Ví dụ:
using System.Text; //... các thành phần khác static void Main (string[] args) { StringBuilder stringBuilder = new StringBuilder(); // Không cần viết: System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); }
Như vậy chỉ thị using
cho phép bạn nạp một namespace con, bạn không cần viết tên đầy đủ gồm cả pham
vi truy cập đến lớp, interface ... trong namespace
Chỉ thị using
cũng giúp bạn đặt tên mới (tên tắt) của namespace, tên này sử dụng trong phạm vi file code.
Cú pháp là using NewName = OldName
.
Ví dụ đặt System.Text
thành XYZ
thì lớp XYZ.StringBuilder
chính là lớp
System.Text.StringBuilder
using XYZ = System.Text; //... các thành phần khác static void Main (string[] args) { XYZ.StringBuilder stringBuilder = new XYZ.StringBuilder(); }
Sử dụng using
chỉ thị truy cập trực tiếp các phương thức tĩnh, mà không cần viết tên lớp
cú pháp nạp phương thức tĩnh của lớp có dạng using static namespace ... class.
Ví dụ phương thức tĩnh WriteLine
trong WriteLine
:
using static System.Console; // cho biết sử dụng trực tiếp các phương thức tĩnh //.. WriteLine ("Xin chào C# NET CORE!"); //..