Bài 2: Hệ thống kiểu trong .NET


.NET cung cấp một hệ thống kiểu rất rộng, phục vụ gần như ngang nhau cho safety (tính an toàn), descriptiveness (khả năng tự mô tả), dynamism (kiểu động), and native interop (tương tác với các thành phần native).

Trước hết, hệ thống kiểu cho phép một mô hình lập trình hướng đối tượng. Nó bao gồm các kiểu, kế thừa (đơn thừa kế), interface (bao gồm default method implementation (phương thức mặc định)) và virtual method để cung cấp một hành vi phù hợp cho tất cả các phân lớp kiểu mà hướng đối tượng cho phép.

Generics là một tính năng phổ biến cho phép các lớp chuyên biệt hóa thành một hoặc nhiều kiểu. Ví dụ: List<T> là một lớp chung mở, nhờ đó ta có thể viết List<string> và List<int> ta không cần phải tạo thêm các lớp ListOfString và ListOfInt riêng biệt, hoặc phải dựa vào object và truyền như trường hợp của ArrayList. Generics cũng cho phép tạo nhiều hệ thống hữu ích trên các kiểu khác nhau (và giảm nhu cầu sử dụng nhiều code), như với Generic Math.

Delegates và lambdas cho phép truyền các phương thức như dữ liệu, giúp dễ dàng tích hợp code bên ngoài vào luồng hoạt động do hệ thống khác sở hữu. Chúng là một loại “glue code” (1) và chữ ký (signature)(2) của chúng thường là tổng quát để có thể sử dụng ở nhiều chỗ khác nhau.

app.MapGet("/Product/{id}", async (int id) =>
{
    if (await IsProductIdValid(id))
    {
        return await GetProductDetails(id);
    }

    return Products.InvalidProduct;
});

Việc sử dụng lambdas như trong ví dụ trên này là một phần của ASP.NET Core Minimal APIs. Nó cho phép cung cấp trực tiếp endpoint implementation cho hệ thống định tuyến. Trong các phiên bản gần đây hơn, ASP.NET Core sử dụng hệ thống kiểu một cách rộng hơn.

Value types và stack-allocated (Đọc thêm: BỘ NHỚ STACK LÀ GÌ?) cung cấp khả năng kiểm soát cấp thấp, trực tiếp hơn đối với dữ liệu và tương tác nền tảng native, trái ngược với các kiểu do GC quản lý của .NET. Hầu hết các kiểu nguyên thủy trong .NET, như kiểu số nguyên, là kiểu giá trị và người dùng có thể xác định kiểu riêng của họ với ngữ nghĩa tương tự.

Các value type được hỗ trợ đầy đủ thông qua hệ thống chung của .NET, có nghĩa là các kiểu generic như List<T> có thể cung cấp các biểu diễn bộ nhớ phẳng, không có thêm các chi phí khi biểu diễn các tập hợp dùng value type. Ngoài ra, .NET generics cung cấp code được dịch chuyên biệt khi các value type được thay thế, nghĩa là các đường dẫn generic code đó có thể tránh được chi phí GC đắt đỏ.

byte magicSequence = 0b1000_0001;
Span<byte> data = stackalloc byte[128];
DuplicateSequence(data[0..4], magicSequence);

Đoạn code này dẫn đến các giá trị được phân bổ theo stack. Span là phiên bản an toàn và phong phú hơn của byte*, cung cấp giá trị độ dài (có kiểm tra giới hạn) và slice rất tiện lợi.

Ref types and variables are a sort of mini-programming model that offers lower-level and lighter-weight abstractions over type system data. This includes Span<T>. This programming model is not general purpose, including significant restrictions to maintain safety.

Các kiểu và biến tham chiếu là một loại mô hình lập trình mini cung cấp các mức độ trừu tượng thấp hơn và nhẹ nhàng hơn đối với dữ liệu hệ thống kiểu. Điều này bao gồm Span<T>. Mô hình lập trình này không phải là đa dụng, và nó bao gồm những hạn chế đáng kể để duy trì sự an toàn.

internal readonly ref T _reference;

Việc sử dụng ref này dẫn đến việc sao chép một con trỏ đến bộ lưu trữ bên dưới thay vì sao chép dữ liệu được tham chiếu bởi con trỏ đó. Các loại giá trị được “sao chép theo giá trị” theo mặc định. Trong khi đó ref cung cấp hành vi “sao chép theo tham chiếu”, và có thể giúp mang lại lợi ích hiệu suất đáng kể.

(1) “Glue code”: có nghĩa là đoạn code này không phải là một thành phần cố định mà nó có thể gắn vào (dán vào – glue) nhiều chỗ khác nhau để dùng với nhiều trường hợp khác nhau.

(2) Chữ ký (signature) của một function là các thành phần kết hợp lại sao cho hàm đó là duy nhất, trình biên dịch dựa trên chữ ký để biết chính xác ta đang gọi đến hàm nào.

Trong các ngôn ngữ lập trình, chữ ký của một function thường là sự kết hợp giữa:

  • Tên function
  • Danh sách tham số (số lượng tham số, kiểu của các tham số)

Trong một lớp không thể có hai function trùng chữ ký.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s