Trong C#, khi nào thì nên dùng == khi nào nên dùng Equals để so sánh. Hai cái này khác nhau sao?
Sau đây là 1 số ý kiến trên group .NET Core VN:
Operator "==" được dùng để so sánh hai đối tượng, nó sẽ kiểm tra xem các đối tượng về cơ bản có tham chiếu đến cùng một địa chỉ nhớ hay không
Còn equals được override để lấy những phương thức cần thiết nhờ đó nội dung của đối tượng được so sánh thay vì địa chỉ của đối tượng
------------------------------------------------------------------
== là so sánh 2 giá trị trên stack, đối với value type thì nó so sánh đúng 2 giá trị nội dung lưu trực tiếp trên stack.
Đối với reference type thì giá trị trên stack chỉ chứa địa chỉ trỏ qua vùng nhớ heap, nếu dùng == trong ngữ cảnh này nó chỉ đảm bảo 2 biến đang trỏ về cùng 1 vùng nhớ heap. Như vậy để so sánh nội dung phức tạp chứa bên vùng nhớ heap, người ta cần phải dùng hàm Equal() hoặc là định nghĩa lại logic cho toán tử ==, ví dụ 2 object kiểu User thì bằng nhau nghĩa là chỉ cần so sánh 2 cái user id thôi chẳng hạn.
Kiểu string cũng là reference type, nếu bạn dùng custom == cũng được, nhưng nó so sánh đủ thứ chuyện từ hoa thường cho tới culture..., như vậy performance không tốt.
Nếu bạn chỉ cần so sánh 2 string với nhau không phân biệt hoa thường và culture này nọ, hàm string.Equals() sẽ cho bạn truyền thêm những tham số options như ignore case... giúp quá trình so sánh giảm thiểu được những so sánh không cần thiết và tăng tốc độ.
Nhưng chú ý thêm nếu bạn dùng entity framework mà trong biểu thức lambda expression, nếu bạn dùng string.Equals() thì nó lại không convert qua sql statements được bởi vì không có hàm tương xứng, cho nên lúc này lại buộc phải dùng ==
------------------------------------------------------------------
Đôi khi ko dùng dc trong LINQ vì, LINQ sẽ bien dịch đoạn query c# đó thành sql statement,
1. thứ nhất, cái object call equal bi null
2. thứ 2, nội dung hàm equal (tùy nha, override dc) nhiều khi impossible de dich ra sql statement nen get exception thoi (example, sâu ben trong equal call 1 hàm gi do phức tap trong code c# mà ko dich ra linq dc)
0 comments: