So sánh
Equals và '=='
Đặc điểm | Toán tử | Phương thức |
|---|---|---|
Loại so sánh mặc định | Kiểu tham chiếu (class): mặc định so sánh tham chiếu (trừ khi kiểu đó overload
| Kiểu tham chiếu (class): mặc định là tham chiếu như |
Ghi đè / tuỳ biến | Có thể overload (không phải override) bằng cách khai báo | Có thể override (virtual method Với generics/hiệu năng, nên triển khai |
Tính linh hoạt | Ít linh hoạt hơn (chỉ 1 toán tử; phải cẩn thận tương thích với | Linh hoạt hơn: có thể override/triển khai |
Tốc độ | Không có quy tắc “nhanh hơn” nói chung. Với | Tương tự: phụ thuộc kiểu cụ thể và triển khai |
Sử dụng với
| An toàn (không ném NRE); | Gọi instance |
Generic và Non-Generic
Đặc điểm | Non-generic | Generic |
|---|---|---|
Khái niệm | Là kiểu dữ liệu truyền thống. Không khai báo cụ thể khi định nghĩa class, method, interface. Kiểu dữ liệu thực tế được xác định khi sử dụng. | Là kiểu dữ liệu được tham số hoá bởi một hoặc nhiều kiểu khác nhau. Cho phép khai báo class, method, interface với kiểu cụ thể. Kiểu này sẽ được định nghĩa và sử dụng xuyên suốt. |
Ưu điểm | Đơn giản, dễ hiểu Hiệu quả cao hơn với các kiểu dữ liệu nguyên thuỷ | Tăng khả năng tái sử dụng code Đảm bảo an toàn dữ liệu vào và ra khi sử dụng Tốt hơn do được tối ưu hoá cho kiểu dữ liệu cụ thể |
Nhược điểm | Kém linh hoạt, khó tái sử dụng. Thiếu an toàn do có thể sử dụng sai kiểu dữ liệu | Phức tạp hơn so với non-generic. Có thể ảnh hưởng hiệu suất với những kiểu dữ liệu phức tạp. |
Sử dụng | Khi cần code đơn giản dễ hiểu, không yêu cầu tái sử dụng cao, không yêu cầu an toàn dữ liệu cao. | Khi cần code có khả năng tái sử dụng cao và yêu cầu tính an toàn dữ liệu cao. |
Delegate và Event
Delegate | Event |
|---|---|
- Là một tham chiếu đại diện cho phương thức. - Có thể gọi trực tiếp từ bất kỳ đâu có quyền truy cập. - Có thể gọi trực tiếp mà không có cơ chế bảo vệ nào nên có thể dẫn đến lỗi. - Ưu tiên tính linh hoạt. | - Là thành phần của lớp sử dụng delegate để quản lý danh sách các phương thức. - Chỉ có thể kích hoạt bên trong lớp mà nó được khai báo. - Có cơ chế bảo vệ ngăn chặn gọi từ bên ngoài. Chỉ cho phép đăng ký bên trong class thông quan += hoặc huỷ đăng ký qua -= - Ưu tiên an toàn và kiểm soát. |
Abstract class và Interface
Tiêu chí | Abstract class | Interface |
|---|---|---|
Định nghĩa | Là lớp nền tảng có biến chung và một phần code sẵn. Lớp con kế thừa và hoàn thiện. | Là bản hợp đồng liệt kê chức năng. Lớp/struct thực hiện (implement) các chức năng đó. |
Access Modifiers | Có | Không. Mặc định là public |
Field, Method dùng chung | Có | Có thể có method mặc định (từ C# 8 trở lên), nhưng không có field, constructor |
Kế thừa / triển khai | Mỗi lớp chỉ kế thừa 1 abstract class. | Một lớp/struct có thể implement nhiều interface. |
Dùng cho struct | Không dùng cho struct. | Dùng được cho struct. |
Khi nên dùng | Dùng để tạo một bản thiết kế chung cho các đối tượng liên quan đến nhau. Cung cấp các chi tiết mà các đối tượng đó phải tuân theo. Khi cần constructor. | Tạo ra một vai trò/chức năng mà các đối tượng triển khai nó sẽ đảm nhiệm. |
Ưu điểm | Tái sử dụng code mạnh, quản lý chung dễ, thêm thành viên thường ít phá vỡ lớp con. | Linh hoạt, áp dụng rộng (kể cả struct), hỗ trợ nhiều vai trò, rất hợp cho test/DI. |
Nhược điểm | Ràng buộc thừa kế (chỉ 1 lớp cha), dễ tạo cây thừa kế sâu nếu lạm dụng. | Không có dữ liệu chung; nếu thêm phương thức mới có thể ảnh hưởng kiểu đã implement (giảm rủi ro nhờ “method mặc định” từ C# 8). |
Ví dụ nhanh (Unity) |
|
|