昨天晚上在群里看到了这道题,我上去就答错了。 正确答案是:true true false true [ 今天经过仔细研究,发现知识点还不少。 涉及到值类型,引用类型,堆栈空间,装箱,以及C#的字符串内存驻留机制,这个机制我会写在下一篇文章里。
==与Equal区别:
1.==比较的是栈空间的值,Equal比较的是堆空间的值 C#有值类型和引用类型: 值类型在栈空间存放,==比较的是值在栈空间的数据是否相等,因为值类型在堆空间没有数据,所以Equal的作用此时和==相同,都比较的是栈空间的数据。 引用类型的数据的地址在栈空间,值则在堆中存放。==比较的是两个栈中的地址是否相等,Equal比较的就是堆中的对象的值是否相等。 2.string类型 C#中的string类型是引用类型,赋值操作则是按值类型操作。
string str01=“wjg”
string str02=“wjg”
str01与str02的值相同,在对str02初始化的时候。并没有重新开辟内存,而是直接将地址指向str01的“wjg”。 因此str01,str02的==比较和Equal比较的意义是一样的,都比较值类型即可 注意点:虽然str01和str02因为值相同所以指向同一个内存地址,但是并非2个相同值相等的字符串就对应同一个内存地址。这一点我会在下一篇文章C#的字符串内存驻留机制里面写。 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class People
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public People(string name)
{
this.name = name;
}
}
class Program
{
static void Main(string\[\] args)
{
string a = new string(new char\[\] { 'w', 'j', 'g', 'b', 'a', 'b', 'y', '.', 'c', 'o', 'm' });
string b = new string(new char\[\] { 'w', 'j', 'g', 'b', 'a', 'b', 'y', '.', 'c', 'o', 'm' });
Console.WriteLine(a == b); //结果为true
Console.WriteLine(a.Equals(b));//结果为true
object g = a;
object h = b;
Console.WriteLine(g == h);//结果为false
Console.WriteLine(g.Equals(h));//结果为true
People p1 = new People("wjg");
People p2 = new People("wjg");
Console.WriteLine(p1 == p2);//结果为false
Console.WriteLine(p1.Equals(p2));//结果为false
People p3 = new People("wjg");
People p4 = p3;
Console.WriteLine(p3 == p4);//结果为true
Console.WriteLine(p3.Equals(p4));//结果为true
Console.ReadLine();
}
}
}
结果如下: C#字符串的内存分配和驻留池机制: http://www.wjgbaby.com/2017/09/30/c%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e5%92%8c%e9%a9%bb%e7%95%99%e6%b1%a0/