C# cơ bản .NET Core
Tính kế thừa (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ý nhận bài viết mới
Tính kế thừa (Bài trước)
(Bài tiếp) Partial, Nested