An toàn là một trong những chủ đề quan trọng nhất trong thập kỷ vừa qua. Nó cũng là một thành phần cốt yếu đối với một môi trường được quản lý như .NET.
Các dạng an toàn:
- An toàn kiểu (type safety) — Một kiểu không thể được dùng ở chỗ của một kiểu khác, nhằm tránh các hành vi không mong muốn.
- An toàn bộ nhớ (memory safety)— Chỉ bộ nhớ được cấp phát mới được sử dụng, ví dụ: một biến chỉ được tham chiếu đến một đối tượng hợp lệ hoặc là null.
- Concurrency or thread safety — Dữ liệu được chia sẻ không được truy cập theo cách có thể dẫn đến hành vi không xác định.
Ghi chú: Chính quyền liên bang Mỹ gần đây đã phát hành một hướng dẫn về Sự quan trọng của anh toàn bộ nhớ.
.NET được thiết kế như một nền tảng an toàn ngay từ đầu. Cụ thể, nó nhằm mục đích tạo ra một thế hệ máy chủ web mới vốn cần chấp nhận đầu vào không đáng tin cậy trong môi trường máy tính thù địch (dịch từ chữ hostile) nhất thế giới (Internet). Hiện tại, người ta thường đồng ý rằng các chương trình web nên được viết bằng một ngôn ngữ an toàn.
An toàn kiểu được thực thi bởi sự kết hợp giữa ngôn ngữ và runtime. Trình biên dịch xác thực các biến tĩnh, chẳng hạn như khi gán các kiểu không giống nhau — ví dụ: gán string cho Stream — sẽ tạo ra lỗi biên dịch. Trình runtime xác thực các biến động, chẳng hạn như khi ép kiểu giữa các kiểu không tương thích, sẽ tạo ra một InvalidCastException.
Memory safety được hỗ trợ phần lớn nhờ sự hợp tác giữa bộ tạo mã (như JIT) và bộ dọn rác. Các biến chỉ có thể hoặc tham chiếu các đối tượng hợp lệ, hoặc null, hoặc nằm ngoài phạm vi (out of scope). Bộ nhớ mặc nhiên được khởi tạo tự động sao cho đối tượng mới không sử dụng đến phần bộ nhớ chưa được khởi tạo. Việc kiểm tra giới hạn (bound checking) đảm bảo rằng việc truy cập một phần tử trong một mảng với chỉ mục không hợp lệ sẽ không được phép — mà thay vào đó sẽ dẫn đến IndexOutOfRangeException.
Xử lý giá trị null là một dạng cụ thể của an toàn bộ nhớ. Các kiểu nullable reference là tính năng của trình biên dịch và ngôn ngữ C# cho phép xác định code không xử lý null một cách an toàn. Đặc biệt, trình biên dịch sẽ cảnh báo nếu bạn sư dụng một biến có thể là null. Bạn cũng có thể không cho phép gán null để trình biên dịch cảnh báo khi bạn gán giá trị cho một biến mà giá trị đó có thể là null. Trình runtime có tính năng xác thực động phù hợp ngăn không cho truy cập tham chiếu null bằng cách phát ra NullReferenceException.
Tính năng này của C# dựa trên các thuộc tính nullable trong thư viện. Nó cũng dựa vào ứng dụng đầy đủ của chúng trong thư viện và app stack (mà chúng ta đã làm) để code của bạn có thể được cung cấp kết quả chính xác từ các công cụ phân tích tĩnh.
string? SomeMethod() => null;
string value = SomeMethod() ?? "default string";
Đoạn code này được trình biên dịch C# coi là null-safety do việc sử dụng null được khai báo và xử lý bởi ??, toán tử null coalescing. Biến value sẽ luôn khác null, đúng với khai báo kiểu của nó.
Không có concurrency safety tích hợp sẵn trong .NET. Thay vào đó, các nhà phát triển cần tuân theo các mẫu và quy ước để tránh những hành vi không xác định. Ngoài ra còn có các bộ phân tích và các công cụ khác trong hệ sinh thái .NET cung cấp thông tin chuyên sâu về các vấn đề tương tranh. Và các thư viện cốt lõi bao gồm vô số kiểu và phương thức an toàn để sử dụng một cách đồng thời, chẳng hạn như các tập concurrent collection hỗ trợ bất kỳ số lượng reader và writer đồng thời nào mà không có nguy cơ làm hỏng cấu trúc dữ liệu.
Trình runtime hiển thị các mô hình safe và unsafe. Tính an toàn được đảm bảo cho safe code, là mặc định, trong khi các nhà phát triển phải chỉ định rõ khi họ sử dụng unsafe code. Unsafe code thường được sử dụng để tương tác với nền tảng bên dưới, tương tác với phần cứng hoặc để triển khai tối ưu hóa thủ công cho các đường dẫn quan trọng về hiệu suất.
Sandbox là một hình thức an toàn đặc biệt giúp cách ly và hạn chế quyền truy cập giữa các thành phần. Chúng tôi dựa trên các công nghệ cách ly tiêu chuẩn, như process (và CGroups (cgroup là công nghệ đứng đằng sau docker/container)), virtual machine và WebAssembly (với các đặc điểm khác nhau của chúng).