Cả hai séc đều khác nhau. Cái đầu tiên kiểm tra danh tính , cái thứ hai kiểm tra sự bình đẳng . Nói chung, hai thuật ngữ giống hệt nhau, nếu chúng đề cập đến cùng một đối tượng. Điều này ngụ ý rằng chúng bình đẳng. Hai số hạng bằng nhau, nếu giá trị của chúng bằng nhau.
Về nhận dạng lập trình thường bị rối bởi bình đẳng tham chiếu. Nếu con trỏ đến cả hai số hạng đều bằng nhau (!), Thì đối tượng mà chúng đang trỏ đến là chính xác cùng một đối tượng. Tuy nhiên, nếu các con trỏ khác nhau, giá trị của các đối tượng mà chúng đang trỏ đến vẫn có thể bằng nhau. Trong C #, danh tính có thể được kiểm tra bằng cách sử dụng Object.ReferenceEquals
thành viên tĩnh , trong khi bình đẳng được kiểm tra bằng cách sử dụng Object.Equals
thành viên không tĩnh . Vì bạn đang đúc hai số nguyên với các đối tượng (được gọi là "đấm bốc", btw), các operatior ==
của object
thực hiện việc kiểm tra đầu tiên, đó là theo mặc định ánh xạ tới Object.ReferenceEquals
và kiểm tra danh tính. Nếu bạn gọi một cách rõ ràng là Equals
-member không tĩnh , điều phối động dẫn đến một cuộc gọi đếnInt32.Equals
, điều này sẽ kiểm tra sự bình đẳng.
Cả hai khái niệm đều tương tự, nhưng không giống nhau. Thoạt đầu chúng có vẻ khó hiểu, nhưng sự khác biệt nhỏ là rất quan trọng! Hãy tưởng tượng hai người, đó là "Alice" và "Bob". Cả hai đều đang sống trong một ngôi nhà màu vàng. Dựa trên giả định, Alice và Bob đang sống trong một quận, nơi các ngôi nhà chỉ khác nhau về màu sắc của chúng, cả hai có thể sống trong những ngôi nhà màu vàng khác nhau. Nếu bạn so sánh cả hai ngôi nhà, bạn sẽ nhận ra rằng chúng hoàn toàn giống nhau, bởi vì chúng đều có màu vàng! Tuy nhiên, họ không ở chung một nhà và do đó các ngôi nhà của họ bình đẳng , nhưng không giống hệt nhau . Nhận dạng có nghĩa là họ đang sống trong cùng một ngôi nhà.
Lưu ý : một số ngôn ngữ đang xác định ===
toán tử để kiểm tra danh tính.
short myShort = 0; int myInt = 0; Console.WriteLine("{0}{1}{2}", myShort.Equals(myInt), myInt.Equals(myShort), myInt == myShort);
Bây giờ hãy kiểm tra nó với thực tế. Dự đoán của bạn có đúng không? Nếu không, bạn có thể giải thích sự khác biệt?