C#中equals和==的区别有哪些
C#中equals和==的区别有哪些
C#中equals和==的区别有哪些
C# 中有两种不同的相等:引用相等和值相等。
◎值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。
◎引用相等意味着要比较的不是两个对象,而是两个对象引用,且两者引用的是同一个对象。
Equals:
下面的语句中,x、y 和 z 表示不为 null 的对象引用。
* 除涉及浮点型的情况外,x.Equals(x) 都返回 true。
* x.Equals(y) 返回与 y.Equals(x) 相同的值。
* 如果 x 和 y 都为 NaN,则 x.Equals(y) 返回 true。
* 当且仅当 x.Equals(z) 返回 true 时,(x.Equals(y) && y.Equals(z)) 才返回 true。
* 只要不修改 x 和 y 引用的对象,对 x.Equals(y) 的相继调用将返回相同的值。
* x.Equals(null) 返回 false。
==:
对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。
对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。
对于 string 类型,== 比较字符串的值。
Equals与==的区别
"==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
"equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。 而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。 实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Person(string name)
{
this.name = name;
}
}
class program
{
static void Main(string[] args)
{
string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b));
object g = a;
object h = b;
Console.WriteLine(g == h);
Console.WriteLine(g.Equals(h));
Person p1 = new Person("jia");
Person p2 = new Person("jia");
Console.WriteLine(p1 == p2);
Console.WriteLine(p1.Equals(p2));
Person p3 = new Person("jia");
Person p4 = p3;
Console.WriteLine(p3 == p4);
Console.WriteLine(p3.Equals(p4));
Console.ReadLine();
}
}
}
输出结果
true ,true ,false ,true ,false ,false ,true ,true 。
总结如下:
1、对于值类型,==和equals等价,都是比较存储信息的内容。
2、对于引用类型,==比较的是引用类型在栈中的地址,equals方法则比较的是引用类型在托管堆中的存储信息的内容。
3、对于string类要特殊处理,它是一个内部已经处理好了equals方法和==的类,故==和equals等价,都是比较存储信息的内容。
4、对于一些自定义的类,我们有必要重载equals方法,否则它默认为基类的equals方法(基类没有重载Equals方法则为Object类中的Equals方法),他们的比较也为地址,而不是引用类型在托管堆中的存储信息的内容。
- C#递归的应用
- C#如何读取csv格式文件
- C#中TryParse的用法
- c#中list排序
- C#获取上个月第一天和最后一天
- C#中ToString()常见的格式
- C#选择排序
- C#中yield
- C# 文件压缩与解压
- C#中的属性、和字段的区别
- C#如何获取真实IP地址
- C#静态变量、静态方法、静态类
- C#enum枚举
- C#正则表达式验证是否日期
- C#中属性的用法
- C#操作datatable
- 点赞 禹州苌庄正式撤乡建镇 未来发展不可估量(禹州苌庄正式撤乡建镇)
- 它荣获 中国生态魅力镇 称号 就在咱们禹州,一起来看看(中国生态魅力镇)
- 真牛 禹州将建成中等城市(禹州将建成中等城市)
- 被骂欺师灭祖,与郭德纲公开叫板,何云伟改名何沄伟,开始画画了(与郭德纲公开叫板)
- 相声转行影帝,被何晴抛弃,甩10年女友闪婚生子,刘威不靠谱情史(相声转行影帝被何晴抛弃)
- 岳云鹏不说相声,改行演员了 网友 快回来说相声(岳云鹏不说相声)
热门推荐
- laravel队列不超时(在laravel中实现事务回滚的方法)
- 织梦tag标签怎样设置(织梦dede修改关键字长度的方法)
- vue走马灯特效(Javascript结合Vue实现对任意迷宫图片的自动寻路)
- html5页面强制刷新(移动端html5判断是否滚动到底部并且下拉加载)
- python简单代码实例(Python实现 版本号对比功能的实例代码)
- unix进程空间的区段(Unix/Linux fork隐藏的开销)
- dedecms自动裁剪(dedecms 图片页面分离简单方法)
- dedecms列表栏目使用教程(DedeCMS文章列表每5隔行加横线的实现方法)
- mysql的limit的分页使用(获取 MySQL innodb B+tree 的高度的方法)
- jQuery多个版本间,以及与其他js文件冲突的解决方法