Lang thang trên các diễn đàn stackoverflow chợt đọc được một vấn đề mà có thể rất nhiều bạn đang học lập trình thường hay mắc phải.
Thường các bạn mới học lập trình hoặc một số bạn chưa lưu ý tới vấn đề so sánh chuỗi hay dùng các câu lệnh so sánh chuỗi là == . Trước khi vào viết bài này mình có đọc kỹ và tham khảo lại bài :
Vào luôn vấn đề nhé, Sau đây là ví dụ nếu các bạn xem qua có thể là hiểu được luôn:
Thường các bạn mới học lập trình hoặc một số bạn chưa lưu ý tới vấn đề so sánh chuỗi hay dùng các câu lệnh so sánh chuỗi là == . Trước khi vào viết bài này mình có đọc kỹ và tham khảo lại bài :
Why would you use String.Equals over ==?
Vào luôn vấn đề nhé, Sau đây là ví dụ nếu các bạn xem qua có thể là hiểu được luôn:
// Comment object obj2 = str3; // Comparision between object obj and string str2 -- Com 1 result = string.Equals(obj, str2);// true result = String.ReferenceEquals(obj, str2); // true result = (obj == str2);// true // Comparision between object obj and string str3 -- Com 2 result = string.Equals(obj, str3);// true result = String.ReferenceEquals(obj, str3); // false result = (obj == str3);// false // Comparision between object obj and string str4 -- Com 3 result = string.Equals(obj, str4);// true result = String.ReferenceEquals(obj, str4); // true result = (obj == str4);// true // Comparision between string str2 and string str3 -- Com 4 result = string.Equals(str2, str3);// true result = String.ReferenceEquals(str2, str3); // false result = (str2 == str3);// true // Comparision between string str2 and string str4 -- Com 5 result = string.Equals(str2, str4);// true result = String.ReferenceEquals(str2, str4); // true result = (str2 == str4);// true // Comparision between string str3 and string str4 -- Com 6 result = string.Equals(str3, str4);// true result = String.ReferenceEquals(str3, str4); // false result = (str3 == str4);// true // Comparision between object obj and object obj2 -- Com 7 result = String.Equals(obj, obj2);// true result = String.ReferenceEquals(obj, obj2); // false result = (obj == obj2);// false
The
Note that some other languages use separate tokens for the two equality-check operators. In VB.NET, for example, the
(*)Types generally only overload equality for comparison with themselves, but it may be useful for types to overload the equality operator for comparison with other particular types; for example,
==
token in C# is used for two different
equality-check operators. When the compiler encounters that token, it
will check whether either of the types being compared has implemented an
equality-operator overload for either the specific combination types
being compared(*), or for a combination of types to which both types can
be converted. If the compiler finds such an overload it will use it.
Otherwise, if the two types are both reference types and they are not
unrelated classes (either may be an interface, or they may be related
classes), the compiler will regard ==
as a reference-comparison operator. If neither condition applies, compilation will fail.Note that some other languages use separate tokens for the two equality-check operators. In VB.NET, for example, the
=
token is used within expressions solely for the overloadable equality-check operator, and Is
is used as a reference-test or null-test operator. An to use =
on a type which does not override the equality-check operator will fail, as will attempting to use Is
for any purpose other than testing reference equality or nullity.(*)Types generally only overload equality for comparison with themselves, but it may be useful for types to overload the equality operator for comparison with other particular types; for example,
int
could have (and IMHO should have but didn't) defined an equality operators for comparison with float
,
so that 16777217 would not report itself equal to 16777216f. As it is,
since no such operator is defined, C# will promote the int
to float
,
rounding it to 16777216f before the equality-check operator sees it;
that operator then sees two equal floating-point numbers and reports
them as equal, unaware of the rounding that took place.