string s1="abc";
string s2="abc";
此时s1与s2指向不同的空间,但为什么System.Object.Equals(s1,s2)的值会为true?
System.Object的Equals方法不是比较两个对象的所引用的实例是否相同的吗?
string s2="abc";
此时s1与s2指向不同的空间,但为什么System.Object.Equals(s1,s2)的值会为true?
System.Object的Equals方法不是比较两个对象的所引用的实例是否相同的吗?
解决方案 »
- 如何根据大纲标题在 word2007 中生成目录
- 十万火急---ViewState的用法
- winCE5.0下串口程序无法接收数据!,请高手帮忙!! SOS...
- 不好解决的javascript和xml问题
- TreeView的问题,搞了半天没搞好,解决立即给分啊!
- C# 客户端应用程序,数据库在外网的一个服务器,怎么传输数据
- 请问一下在c#中实现漂亮的界面,有没有什么控件和程序,资料介绍一下?
- c# 实现在mpg视频中增加摄像头捕获的信息 倾囊送分
- winform
- !!!请问高手.NET下分帧的问题!!!
- 如何遍历一个文件夹下的所有文件,并连通文件夹一起传到服务器,
- installshield 11.5 中如何安装系统服务
没错。.net对字串处理比较特殊,它会检查当前动态分配的字串中是否有这个字串,如果有,则返回引用,否则创建新对象,返回引用。这里是存在的。自然指向同一个对象了。
如果存在存放有它会检查当前动态分配的字串中是否有这个字串,如果有,则返回引用,否则创建新对象,返回引用。那是不是说
string s1="abc";//生成空间A
string s2="abc";此时不生成空间,而是把s2直接引用空间A
string s3="a";此时生成空间B
都不知道事实是否和你说的一样的,很难论证啊
string是一个类啊 .这是它的本质.它也应该符合类的特征吧.我觉得你的解释虽然对不对和结果都无多大联系,但我总觉得不是这样的.我现在觉得是System.Object.Equals方法对string类有特殊的处理就是了
字符串在比较时,第一个判断是不是相同的引用,因为它们指向字符串池中同一个地址,
当然相同。你如果不信的话可以用Reflector看看其源码
char[] c1=new char[]{'a','b','c'};
string s1="abc";
string s2=new string(c1);
object.Equals(s1,s2);
此时也是返回true啊
new string(c1)此时会不会创建新的实例啊
string s2="abc";
没错.net对字串处理比较特殊,它会检查当前动态分配的字串中是否有这个字串,如果有,则返回引用,否则创建新对象,返回引用。这里是存在的。自然指向同一个对象了。这个是正确的,但同时System.Object.Equals(s1,s2)的值会为true是因为Equals这个方法是比较存放在其中的内容,而不是所指向的地址。
string是特殊的引用类型
Equals函数只判断值是否相等
//System.Object的Equals方法不是比较两个对象的所引用的实例是否相同的吗?
string s1="abc";
string s2="abc";
public override bool Equals(object);
public bool Equals(string);
public static bool Equals(string, string);
前两个实例方法内部会调用CompareOrdinal静态方法,它会字符串中的各个字符,如果相等就返回true,第三个首先会检查两个引用指向的是否是同一个对象,如果是,就返回true,不再去比较各个字符了,其实CLR使用了一种叫字符串驻留的技术,对于楼主的代码string s1="abc";string s2="abc";当CLR初始化时,会创建一个内部的散列表,其中的键为字符串,值为指向托管堆中字符串的引用,刚开始,散列表为空,JIT编译器编译方法时,会在散列表中查找每一个文本常量字符串,首先会查找"abc"字符串,并且因为没有找到,编译器会在托管堆中构造一个新的指向"abc"的String对象引用,然后将"abc"字符串和指向该对象的引用添加到散列表中,接着,在散列表中查找第二个"abc",这一次由于找到了该字符串,所以编译器不会执行任何操作,代码中再没有其它的文本常量字符串,编译器的任务完成,代码开始执行。执行时,CLR发现第一个语句需要一个"abc"字符串引用,于是,CLR会在内部的散列表中查找"abc",并且会找到,这样指向先前创建的String对象的引用就被保存在变量s1中,执行第二条语句时,CLR会再一次在散列表中查找"abc",并且仍然会找到,指向同一个String对象的引用会被保存在变量s2中,到此s1和s2指向了同一个引用,所以System.Object.Equals(s1,s2)就当然返回true了。另外,C#中是不允许用new操作符创建String对象的,编译器会报错。
string s2="abc";
此时s1与s2指向不同的空间,但为什么System.Object.Equals(s1,s2)的值会为true?Equals先检查两个字符串的引用是否相同,是则返回true
如果不相同,再检查值是否相同,是则返回true