Compare object identity

Trong C++, giả sử mình có class Node được định nghĩa như sau:

class Node
{
   public:
      Node(int data, const char& pName)
      {
          this->data = data;
          memcpy(name, pName, 20);
      }
      int data;
      char name[20];
}

Mình sẽ tạo ra 4 node và bỏ vào một cái array.

{
   Node* array[4];
   array[0] = new Node(0, “Banana”);
   array[1] = new Node(10, “Mango”);
   array[2] = new Node(20, “Durian”);
   array[3] = new Node(10, “Mango”);
}

array[1] và array[3] là 2 object có các trường giống nhau nhưng là 2 cái riêng biệt chỉ đến 2 vùng nhớ riêng biệt.
Mình có 1 cái method như sau:

public void deleteNode(Node* pNode);

Bây giờ nếu mình muốn xóa cái array[3] thì cách tốt nhất là dùng địa chỉ chứ nếu xóa bằng cách loop qua cái array rồi xem node nào mà có các trường có cùng giá trị với node truyền vào thì chắc chắn array[1] sẽ bị xóa chứ không phải array[3].
Bây giờ có cách nào để làm điều tương tự trong C# hay không? Cách duy nhất mình nghĩ đến là so sánh giá trị hashcode. Mình có coi qua Object.ReferenceEquals() nhưng nó chỉ so sánh các trường rồi kết luận là 2 cái object bằng nhau thôi.

doc của ReferenceEquals nó ghi là “Returns true if objA is the same instance as objB or if both are null ; otherwise, false.” vậy là so sánh địa chỉ đúng rồi mà @_@

4 Likes


Về bản chất thì object bên C# bản thân nó đã là reference rồi nên dùng == để so sánh là đã như so sánh pointer bên C++.

Tuy nhiên, câu hỏi của bạn lại có mấy vấn đề như sau:

  1. array[1]array[3] đều có value như nhau, nên về mặt ngữ nghĩa thì dù xoá 1 hay 3 thì array còn lại cũng còn chứa các phần tử giống nhau cả, chỉ khác thứ tự mà thôi.
  2. Khi bạn đã có identity của object (pointer bên C++, reference bên C#) thì tại sao không xử lý luôn với nó mà lại phải loop toàn array để tìm lại làm gì? Cái này giống như bạn đã có địa chỉ nhà, thay vì đi thẳng đến nhà đó rồi gõ cửa, bạn lại đi lòng vòng hết khu phố rồi check từng địa chỉ nhà coi có giống không.
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?