在c#中string是个特殊的存在,介于引用类型和值类型之间,string就是String的一个别名而已,没有其他区别。
一般来说==是用于值类型的比较,而Equals用于字符串的比较,由于string类型比较特殊,如下:
string a="a";
string b="a";
char[] c={'a'};
string d=new string(c);
string e=new StringBuilder().Append("a").ToString();
这几种创建方式不同,导致比较结构也不同
string stringD = " ";//空白字符串
var resultD1 = string.IsNullOrEmpty(stringD);//false var resultD2= string.IsNullOrWhiteSpace(stringD);//true
判断相等有两种方式,一种是传统的==操作,一种是object提供的Equals方法。二者的区别在于:
一、==操作符判断的是堆栈中的值,Equlas判断的是堆中的值。
C#提供值类型和引用类型,值类型存储在栈上,故用==判断是直接判断其值是否相等,因为值类型不存在堆中的数据,因此值类型的Equals也是判断数据。即,对于值类型而言,==与Equals相同,均是判断其值是否相等。
对于引用类型而言,其栈中存储的是对象的地址,那么==就是比较两个地址是否相等,即是否指向同一个对象;Equals函数则是比较两个对象在堆中的数据是否一样,即两个引用类型是否是对同一个对象的引用。
二、String类型特殊
String类型虽然是引用类型,但是对String对象的赋值却按照值类型操作。
例如:
String s1="test"; String s2="test";对s2初始化的时候,并没有重新开辟内存,而是直接将其地址指向s1的内容“hello”。这样一来,string类型虽然是引用类型,但是其==操作和Equals操作都是一样的,均比较值是否相等。
(1)属于基本数据类型;
(2)是引用类型;
(3)只读;
(4) string a="1123";
string b="1123";
那么a和b指向同一个内存地址;
但是并非2个相同值相等的字符串就对应同一个内存地址;
