Chúng ta thường thấu hầu hết các developer không phân biệt được sự khác nhau giữa biến kiểu object và dynamic trong C#. Tôi đã cố tìm các bài hướng dẫn trên web, nhưng không thể tìm thấy một lời giải hợp lý cho vấn đề này. Bài viết này sẽ giải thích vài điểm căn bản quan trọng về sự khác nhau giữa từ khóa object và dynamic trong C#.
Tổng quan, cả dynamic và object đều không được thực hiện việc kiểm tra kiểu khi biên dịch và được định danh kiểu của các biến lúc runtime tức là lúc chạy chương trình và cả 2 đều có thể được lưu giá trị thuộc kiểu bất kỳ. Object đươc giới thiệu trong C# 1.0. Sau đó tại sao dynamic lại được giới thiệu ở 4.0 khi mà object đã tồn tại rồi.
Các bạn hãy chú ý một số điểm khác biệt sau đây giữa biến kiểu object và dynamic trong C#:
Sự khác nhau số 1
- Object: Trình biên dịch có 1 phần thông tin về kiểu của biến, đây không phải là kiểu biên dịch an toàn.
Ví dụ:
Bạn cần chuyển đổi kiểu tường minh mọi lúc bạn muốn lấy giá trị của biến.
object a = "Rohatash Kumar"; string a1 = a.ToString();
- Dynamic: Trong biến dynamic, trình biên dịch không có bất cứ thông tin gì về kiểu của biến.
dynamic a = "Rohatash Kumar"; string a1 = a;
Sự khác nhau số 2
- Object: Được giới thiệu trong C# 1.0.
- Dynamic: Được giới thiệu trong C# 4.0.
Sự khác nhau số 3 3
- Object: Khi sử dụng một object, bạn cần chuyển kiểu biến object sang kiểu nguyên bản của nó để dùng trong các mục đích mong muốn. Trong sự khác nhau số 1, ví dụ dưới đây cho ra 1 lỗi.
object a = "Rohatash Kumar"; string a1 = a;
Nên bạn cần chuyển đổi kiểu mỗi khi bạn sử dụng nó
- Dynamic: Chuyển đổi kiểu không bắt buộc trừ khi bạn có thể cần biết các thuộc tính và phương thức liên quan đến kiểu dữ liệu.
Sự khác nhau số 4
- Object: Khi bạn sử dụng từ khóa object với một biến, nó có thể sinh ra một vấn đề lúc thực thi nếu giá trị được lưu trữ không chuyển sang được kiểu dữ liệu tương ứng. Nó có thể không hiển thị lỗi ở lúc biên dịch nhưng nó sẽ hiển thị lỗi lúc thực thi.
Ví dụ
String a = "Rohatash Kumar"; object a1 = a; int b = (int)a1;
Bây giờ hãy thực thi đoạn code:
- Dynamic: Khi chúng ta sử dụng từ khóa dynamic, nó sẽ không xảy ra vấn đề vì trình biên dịch có tất cả thông tin về giá trị được lưu trữ.
Tổng kết
Object hữu ích khi bạn không có thêm thông tin về kiểu dữ liệu. Dynamic hữu ích khi bạn cần code sử dụng reflection hoặc ngôn ngữ động hoặc các đối tượng COM và khi lấy giá trị từ một câu truy vấn LinQ.
Trích nguồn từ: (c-sharpcorner.com)