C# Cơ bản .NET Core §1 Cài đặt, chương trình C# đầu tiên §2 Biến, kiểu dữ liệu và nhập/xuất §3 Toán tử số học và gán §4 So sánh, logic và lệnh if, switch §5 Vòng lặp for, while §6 Phương thức - Method §7 Phương thức - Delegate §8 Lớp - Class §9 Namespace §10 Partial, Nested §11 Kiểu giá trị, tham chiếu §12 Kiểu vô danh và dynamic §13 Biểu thức lambda §14 Event §15 Hàm hủy - Quá tải toán tử - thành viên tĩnh - indexer §16 null và nullable §17 Mảng §18 Chuỗi ký tự §19 Tính kế thừa §20 Phương thức khởi tạo §21 Tính đa hình - abstract - interface §22 Struct và Enum §23 Ngoại lệ Exeption §24 IDisposable - using §25 File cơ bản §26 FileStream §27 Generic §28 Collection - List §29 SortedList §30 Queue / Stack §31 Linkedlist §32 Dictionary - HashSet §33 Phương thức mở rộng §34 ObservableCollection §35 LINQ §36 (Multithreading) async - bất đồng bộ §37 Type §38 Attribute Annotation §39 DI Dependency Injection §40 (Multithreading) Parallel §41 Thư viện lớp §42 (Networking) HttpClient §43 (Networking) HttpMessageHandler §44 (Networking) HttpListener §45 (Networking) Tcp TcpListenerr/TcpClient §46 (ADO.NET) SqlConnection §47 (ADO.NET) SqlCommand §48 (EF Core) Tổng quan §49 (EF Core) Tạo Model §50 (EF Core) Fluent API §51 (EF Core) Query §52 (EF Core) Scaffold §53 (EF Core) Migration §54 (ASP.NET CORE) Hello World! §55 (ASP.NET CORE) Middleware §56 (ASP.NET CORE) Map - Request - Response §57 (ASP.NET CORE) IServiceCollection - MapWhen §58 (ASP.NET CORE) Session - ISession §59 (ASP.NET CORE) Configuration §60 (ASP.NET CORE) Gửi Mail §61 (ASP.NET RAZOR) Khởi tạo và Route §62 (ASP.NET RAZOR) Cú pháp Razor §63 (ASP.NET RAZOR) Layout trong ASP.NET Core §64 (ASP.NET RAZOR) Partial §65 (ASP.NET RAZOR) ViewComponent §66 (ASP.NET RAZOR) TagHelper §67 (ASP.NET RAZOR) PageModel §68 (ASP.NET RAZOR) Model Binding §69 (ASP.NET RAZOR) HTML Form, Validation §70 (ASP.NET RAZOR) Upload File §71 (ASP.NET RAZOR) HtmlHelper §72 (ASP.NET RAZOR) Entity Framework §73 (ASP.NET RAZOR) Paging §74 (ASP.NET RAZOR) Identity (1) - Register, Login, Logout §75 (ASP.NET RAZOR) Identity (2) Lockout, Reset Password §76 (ASP.NET RAZOR) Identity (3) Google Login §77 (ASP.NET RAZOR) Identity (4) Facebook Login §78 (ASP.NET RAZOR) Identity (5) profile, password, email ... §79 (ASP.NET RAZOR) Identity (6) Role §80 (ASP.NET RAZOR) Identity (7) Role-based Authorization §81 (ASP.NET RAZOR) Identity (8) RoleClaim §82 (ASP.NET RAZOR) Identity (9) Authorization Handler §83 (ASP.NET RAZOR) IAuthorizationService §84 (ASP.NET MVC) Controller - View §85 (ASP.NET MVC) MVC Route
Lớp - Class (Bài trước)
(Bài tiếp) Partial, Nested

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 namespace System sử dụng được trong code. Như lớp Console định nghĩa trong System 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ên Program

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!");
//..

Đăng ký theo dõi ủng hộ kênh
Lớp - Class (Bài trước)
(Bài tiếp) Partial, Nested