Microsoft nâng cao độ an toàn bộ nhớ cho C# mà không cần biến nó thành Rust

Phần mềm26 tháng 5, 2026·5 phút đọc

Microsoft đang lên kế hoạch cải thiện độ an toàn bộ nhớ của C# bằng cách định nghĩa lại từ khóa "unsafe" và giới thiệu một mô hình mới. Mục tiêu là làm cho ngôn ngữ này an toàn hơn giống Rust, nhưng vẫn giữ nguyên khả năng quản lý bộ nhớ tự động.

Microsoft nâng cao độ an toàn bộ nhớ cho C# mà không cần biến nó thành Rust

Microsoft muốn làm cho ngôn ngữ lập trình C# trở nên an toàn hơn mà không biến nó thành một bản sao của Rust. Richard Lander, quản lý sản phẩm .NET của Microsoft, đã đăng tải một bài viết dài chi tiết về kế hoạch cải thiện độ an toàn bộ nhớ (memory safety) của C#. Đội ngũ phát triển dự định giới thiệu một mô hình mới và định nghĩa lại từ khóa "unsafe" hiện có, nhằm đưa ngôn ngữ này tiến gần hơn đến Rust về mặt an toàn, nhưng vẫn giữ nguyên cơ chế quản lý bộ nhớ tự động.

"Chúng tôi hình dung về một tương lai nơi C# nằm trong số những ngôn ngữ được lựa chọn và được ghi nhận vì việc thực thi tính an toàn về kiểu dữ liệu và bộ nhớ," ông Lander chia sẻ.

Vấn đề của mã "Unsafe"

Nhiều lập trình viên C# hiện đại hiếm khi sử dụng mã "unsafe", nhưng nó đã là một phần cốt lõi của ngôn ngữ kể từ phiên bản đầu tiên. Theo cuốn sách The C# Programming Language do cha đẻ của ngôn ngữ Anders Hejlsberg và các cộng sự viết, việc viết mã unsafe giống như viết mã C bên trong một chương trình C#.

Các trường hợp cần sử dụng mã unsafe thường bao gồm: tương tác trực tiếp với hệ điều hành bên dưới (interop), truy cập các thiết bị ánh xạ bộ nhớ (memory-mapped devices), hoặc triển khai các đoạn mã đòi hỏi hiệu suất thời gian thực cao. Mã unsafe cho phép sử dụng các kiểu con trỏ (pointer), vốn không được theo dõi bởi bộ thu gom rác (garbage collector) của .NET, cũng như các toán tử con trỏ. Trước đây, công cụ sửa đổi unsafe hiện tại không có tác dụng gì khác ngoài việc cho phép sử dụng các tính năng này.

Thay đổi lớn trong C# 16

Những thay đổi này sẽ được áp dụng trong C# 16, phiên bản dự kiến phát hành vào cuối năm 2027 cùng với .NET 12 (bản hỗ trợ dài hạn - LTS). Người dùng có thể trải nghiệm trước các tính năng này trong bản xem trước của C# 15 và .NET 11.

Trong mô hình mới, việc đánh dấu một phương thức là "unsafe" cũng đồng nghĩa với việc đánh dấu nó là "requires-unsafe" (yêu cầu unsafe). Điều này có nghĩa là người gọi phương thức cũng phải nằm trong ngữ cảnh unsafe, và các phương thức ghi đè (overrides) không thể là unsafe nếu thành viên cơ sở là an toàn. Về cơ bản, chỉ định unsafe sẽ lan truyền (propagate) đến người gọi cho đến khi nó bị chặn lại bằng cách bao gồm một ngữ cảnh unsafe bên trong một phương thức, nhưng không đánh dấu phương thức đó là unsafe.

Một thay đổi quan trọng khác là sẽ không còn khả năng đánh dấu một kiểu (type) là unsafe; phạm vi của unsafe sẽ chuyển xuống các phương thức, thuộc tính và trường riêng lẻ.

Sử dụng con trỏ và lộ trình áp dụng

Một điểm thú vị trong đề xuất mới là việc sử dụng các kiểu con trỏ và một số biểu thức con trỏ sẽ không còn được coi là unsafe theo mặc định. Chỉ khi giải tham chiếu (dereferencing) một con trỏ — tức là truy cập vào bộ nhớ không được quản lý thông qua con trỏ đó — mới yêu cầu một ngữ cảnh unsafe.

Các thay đổi này sẽ là tùy chọn (opt-in) trong C# 16, cho phép các nhà phát triển tiếp tục sử dụng mô hình cũ nếu muốn. Tuy nhiên, ông Lander cho biết các thư viện runtime của .NET sẽ chuyển sang sử dụng mô hình mới. Ngoài ra, Microsoft đang xem xét thêm các huy hiệu (badges) trên các gói trong NuGet — kho lưu trữ gói .NET — để hiển thị xem chúng đã bật tính năng mới chưa nhằm khuyến khích việc áp dụng. Một phiên bản C# trong tương lai có thể sẽ chuyển mô hình này sang chế độ opt-out (từ chối tham gia) thay vì opt-in.

"Mục tiêu của chúng tôi là biến mô hình an toàn mới của C# thành tiêu chuẩn mới," ông Lander khẳng định.

Mục tiêu và phản hồi của cộng đồng

Ý tưởng đằng sau những thay đổi này không phải là làm cho mã unsafe ít nguy hiểm hơn, mà là làm cho nó dễ nhìn thấy hơn và dễ dàng kiểm duyệt (review) hơn. Điều này mở rộng sang tài liệu về an toàn, thông qua các bình luận trên thành viên unsafe để định nghĩa hợp đồng sử dụng, điều này sẽ được các công cụ phân tích mã tĩnh khuyến khích.

Phản ứng từ cộng đồng lập trình viên cho đến nay chủ yếu là tích cực. Một lập trình viên đồng thời là nhà phát triển cả C# và Rust nhận xét: "Tôi rất hoan nghênh điều này... Tôi sẽ không ghét nếu C# trở nên gần giống với một phiên bản Rust được quản lý bộ nhớ".

Mặc dù các lập trình viên làm việc trên các ứng dụng kinh doanh có thể không nhận thấy bất kỳ sự thay đổi nào vì họ hiếm khi chạm đến mã unsafe, nhưng ông Lander stated rằng "tính năng này là một trong những thay đổi có tác động lớn nhất mà chúng tôi có thể thực hiện" để cải thiện niềm tin vào độ an toàn của mã C#.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗