Vấn đề được quan sát ở đây là một trường hợp đặc biệt của một vấn đề tổng quát hơn, đó là số lượng các định nghĩa khác nhau về bình đẳng có thể hữu ích trong ít nhất một số trường hợp vượt quá số lượng các phương tiện phổ biến hiện có để diễn đạt chúng. Trong một số trường hợp, vấn đề này trở nên tồi tệ hơn bởi một niềm tin đáng tiếc rằng thật khó hiểu khi có các phương tiện kiểm tra sự bình đẳng khác nhau mang lại kết quả khác nhau và có thể tránh được sự nhầm lẫn đó bằng cách để các dạng bình đẳng khác nhau mang lại kết quả giống nhau bất cứ khi nào có thể.
Trên thực tế, nguyên nhân cơ bản của sự nhầm lẫn là một niềm tin sai lầm rằng các hình thức kiểm tra bình đẳng và bất bình đẳng khác nhau nên được mong đợi mang lại cùng một kết quả, mặc dù thực tế là các ngữ nghĩa khác nhau sẽ hữu ích trong các trường hợp khác nhau. Ví dụ, từ quan điểm số học, sẽ rất hữu ích khi có thể có Decimal
số chỉ khác nhau về số lượng các số 0 ở cuối so sánh là bằng nhau. Tương tự như vậy đối với double
các giá trị như số 0 dương và số 0 âm. Mặt khác, từ quan điểm bộ nhớ đệm hoặc interning, ngữ nghĩa như vậy có thể gây chết người. Giả sử, ví dụ, một người có một Dictionary<Decimal, String>
như vậy myDict[someDecimal]
phải bằng someDecimal.ToString()
. Một đối tượng như vậy sẽ có vẻ hợp lý nếu một người có nhiềuDecimal
giá trị mà người ta muốn chuyển đổi thành chuỗi và dự kiến sẽ có nhiều bản sao. Thật không may, nếu sử dụng bộ nhớ đệm như vậy để chuyển đổi 12,3 m và 12,40 m, tiếp theo là 12,30 m và 12,4 m, các giá trị sau sẽ mang lại "12,3" và "12,40" thay vì "12,30" và "12,4".
Quay trở lại vấn đề hiện tại, có nhiều hơn một cách hợp lý để so sánh các đối tượng vô hiệu cho bằng nhau. C # có quan điểm mà ==
toán tử của nó phải phản ánh hành vi của nó Equals
.VB.NET có quan điểm rằng hành vi của nó phải phản ánh hành vi của một số ngôn ngữ khác, vì bất kỳ ai muốn Equals
hành vi đều có thể sử dụng Equals
. Theo một nghĩa nào đó, giải pháp phù hợp sẽ là có một cấu trúc "nếu" ba chiều và yêu cầu rằng nếu biểu thức điều kiện trả về kết quả ba giá trị, thì mã phải chỉ định điều gì sẽ xảy ra trongnull
trường hợp đó. Vì đó không phải là một lựa chọn với các ngôn ngữ như chúng vốn có, nên giải pháp thay thế tốt nhất tiếp theo là chỉ cần tìm hiểu cách các ngôn ngữ khác nhau hoạt động và nhận ra rằng chúng không giống nhau.
Ngẫu nhiên, toán tử "Is" của Visual Basic, thiếu C, có thể được sử dụng để kiểm tra xem một đối tượng null có thực sự là null hay không. Trong khi người ta có thể đặt câu hỏi một cách hợp lý liệu một if
bài kiểm tra có nên chấp nhận a hay không Boolean?
, việc các toán tử so sánh bình thường trả về Boolean?
thay vì Boolean
khi được gọi trên các kiểu nullable là một tính năng hữu ích. Ngẫu nhiên, trong VB.NET, nếu một người cố gắng sử dụng toán tử bình đẳng hơn là Is
, người ta sẽ nhận được cảnh báo rằng kết quả của phép so sánh sẽ luôn là Nothing
và người ta nên sử dụng Is
nếu muốn kiểm tra xem có điều gì đó là rỗng hay không.