c#-关于.Equals()与==运算符以及基元与对象的比较的困惑
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-关于.Equals()与==运算符以及基元与对象的比较的困惑,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2468字,纯文字阅读大概需要4分钟。
内容图文
考虑以下代码:
int a = 0;
short b = 0;
int c = 0;
object a1 = a;
object b1 = b;
object c1 = c;
Console.WriteLine(1);
//comparing primitives - int vs. short
Console.WriteLine(a == b);
Console.WriteLine(b == a);
Console.WriteLine(a.Equals(b));
Console.WriteLine(b.Equals(a));
Console.WriteLine(2);
//comparing objects - int vs. int
Console.WriteLine(c1 == a1);
Console.WriteLine(a1 == c1);
Console.WriteLine(c1.Equals(a1));
Console.WriteLine(a1.Equals(c1));
Console.WriteLine(3);
//comparing objects - int vs. short
Console.WriteLine(a1 == b1);
Console.WriteLine(b1 == a1);
Console.WriteLine(a1.Equals(b1)); //???
Console.WriteLine(b1.Equals(a1));
它输出以下输出:
1
True
True
True
False
2
False
False
True
True
3
False
False
False
False
我知道的;有什么清楚的
第2节:==运算符仅在与两个不同名称引用的内存中的一个对象进行比较时才返回true(不是很频繁,但可能会发生). Equals()方法比较对象的内容(值).在本网站的许多答案中都提到了它.
第1节:编译器使用==运算符,将“较小”类型转换为“较大”类型(对int短),并比较原始值.操作数(变量)的顺序无关紧要.最后一行Equals()的结果可能令人困惑,因为它返回false(不比较值),但可以理解.这里的顺序很重要.如在answer中所了解的,必须选择最佳的过载.通过第一个变量的类型选择它:short.Equals(short).但是后来int不能转换为“ smaller”类型(短型),因此没有进行比较并且方法返回false.
问题:
>我的理解是否正确?
>为什么第3节的最后两行(使用Equals())都返回false?为什么第1节第3行有差异?为什么不进行过载和值比较?它变得非常抽象,我找不到原因.
解决方法:
在第1行第3行中
int a = 0;
short b = 0;
Console.WriteLine(a.Equals(b));
您将其称为int的重载:bool Equals(int other),因为b(短整数)可以隐式转换为int,因此选择了此重载.它返回true.在第3节第3行中
int a = 0;
short b = 0;
object a1 = a;
object b1 = b;
Console.WriteLine(a1.Equals(b1)); //???
另一个int重载(不是对象,因为Equals是虚拟方法)被称为:bool Equals(object other).为了使其返回true,other应该具有完全相同的类型(int),但它确实很短,因此返回false.装箱与此处无关,您可以通过以下方式进行验证:
int a = 0;
int c = 0;
object a1 = a;
object c1 = c;
// yes, different objects
Console.WriteLine(a1 == c1); // false
// still equal, because both are boxed ints
Console.WriteLine(a1.Equals(c1)); // true
至于理解,我认为documentation包含所有相关信息.请记住:
> ==运算符和Equals方法都可以在类中手动定义,因此从理论上讲可以做任何事情.您的理解仅与“默认”行为有关.
> ==在一般意义上不是虚拟的,与Equals方法不同.因此,当您执行a1 == b1-==在编译时被定义为要调用时(基于a1和b1的类型),但是当您调用a1.Equals(b1)时-实际上是分派的,因此定义了调用方法在运行时.
内容总结
以上是互联网集市为您收集整理的c#-关于.Equals()与==运算符以及基元与对象的比较的困惑全部内容,希望文章能够帮你解决c#-关于.Equals()与==运算符以及基元与对象的比较的困惑所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。