c# Equals和==的区别
2015-11-10 17:36
567 查看
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。
总结:
(1)==比较的是值
(2)Equals比较的是对象的引用
(3)string是特殊的引用类型
string str1 = “abc”;
string str2 = “abc”;
这样写两种比较都是相等的,因为系统没有给str2分配内存,只是把“abc”指向了str2,但是如果new了就是分配新内存了
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。
class Program { static void Main(string[] args) { //string str1 = "abc"; //string str2 = "abc"; string str1 = new string(new char[]{'h','i'}); string str2 = new string(new char[] { 'h', 'i' }); Console.WriteLine(str1 == str2);//true Console.WriteLine(str1.Equals(str2));//true object obj1 = str1; object obj2 = str2; Console.WriteLine(obj1 == obj2);//false(如果str1和str2不是new的则是true) Console.WriteLine(obj1.Equals(obj2));//true Console.WriteLine("--------------------"); User u1 = new User("a"); User u2 = new User("a"); Console.WriteLine(u1 == u2);//false Console.WriteLine(u1.Equals(u2));//false Console.ReadLine(); } } class User { public string name = ""; public User(string value) { name = value; } }
总结:
(1)==比较的是值
(2)Equals比较的是对象的引用
(3)string是特殊的引用类型
string str1 = “abc”;
string str2 = “abc”;
这样写两种比较都是相等的,因为系统没有给str2分配内存,只是把“abc”指向了str2,但是如果new了就是分配新内存了
相关文章推荐
- c#实现16进制和字符串之间转换的代码
- (转)C#为什么要使用Invoke,它和BeginInvoke有什么区别
- c#自制视屏监控
- C#中int? 转换为 int 型
- C#基础系列——一场风花雪月的邂逅:接口和抽象类
- NET(C#)接入Dubbo服务,Zookeeper作为Dubbo服务的注册中心,实现thrift协议访问接口(1)
- NET(C#)接入Dubbo服务,Zookeeper作为Dubbo服务的注册中心,实现thrift协议访问接口(1)
- C#常用字符串加密解密方法封装代码
- C# 大小写转换,方便index of
- C#按照指定长度分割中英文字符串
- C# ListView用法详解 很完整
- C# WPF 读写Excel文件
- c# EXCEL读取
- C#中Trim()、TrimStart()、TrimEnd()的用法
- C#操作word之文本替换
- C#之数据类型转换
- C# WebService 基础实例
- C#--表达式计数器,有小数点,没有优先级。
- C#调用非托管DLL时遇到“找不到指定的模块”问题解决方法
- c#调用dll获取dll物理路径的方法