您的位置:首页 > 编程语言 > C#

c# Equals和==的区别

2015-11-10 17:36 567 查看
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

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了就是分配新内存了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: