社区
C#
帖子详情
c# string类的比较
asggg
2006-03-26 04:37:38
string s1="abc";
string s2="abc";
此时s1与s2指向不同的空间,但为什么System.Object.Equals(s1,s2)的值会为true?
System.Object的Equals方法不是比较两个对象的所引用的实例是否相同的吗?
...全文
804
21
打赏
收藏
c# string类的比较
string s1="abc"; string s2="abc"; 此时s1与s2指向不同的空间,但为什么System.Object.Equals(s1,s2)的值会为true? System.Object的Equals方法不是比较两个对象的所引用的实例是否相同的吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
liyufeng1983
2006-03-28
打赏
举报
回复
楼上朋友说的对哦,Equals有三个版本:
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对象的,编译器会报错。
pxx_pxx
2006-03-28
打赏
举报
回复
string s1="abc";
string s2="abc";
此时s1与s2指向不同的空间,但为什么System.Object.Equals(s1,s2)的值会为true?
Equals先检查两个字符串的引用是否相同,是则返回true
如果不相同,再检查值是否相同,是则返回true
slxu_yjs04
2006-03-27
打赏
举报
回复
string s1="abc";
string s2="abc";
没错.net对字串处理比较特殊,它会检查当前动态分配的字串中是否有这个字串,如果有,则返回引用,否则创建新对象,返回引用。这里是存在的。自然指向同一个对象了。
这个是正确的,但同时System.Object.Equals(s1,s2)的值会为true是因为Equals这个方法是比较存放在其中的内容,而不是所指向的地址。
alanzhou
2006-03-27
打赏
举报
回复
C#高级编程上说,.net对string的比较作了特殊处理,使它产生这样的效果的。为了简化编程。
hainang1234
2006-03-27
打赏
举报
回复
首先,Object.Equals是比较值。
其次,这种情况下s1和s2确实指向同一个对象:
string s1="abc";
string s2="abc";
Problemmer_x
2006-03-27
打赏
举报
回复
呵呵,你提的问题已经把你的问题解决掉了
//System.Object的Equals方法不是比较两个对象的所引用的实例是否相同的吗?
youngwolf
2006-03-27
打赏
举报
回复
谁告诉你Equals函数比较地址?它是可重载的!
ChumpKlutz
2006-03-27
打赏
举报
回复
傻比
string是特殊的引用类型
Equals函数只判断值是否相等
xjjdanran
2006-03-26
打赏
举报
回复
呵呵,没有研究过,期待大侠们指导吧
asggg
2006-03-26
打赏
举报
回复
字符串池啊 JAVA和C#的原理不是完全相同的吧>>>>
asggg
2006-03-26
打赏
举报
回复
但为什么:
char[] c1=new char[]{'a','b','c'};
string s1="abc";
string s2=new string(c1);
object.Equals(s1,s2);
此时也是返回true啊
new string(c1)此时会不会创建新的实例啊
asggg
2006-03-26
打赏
举报
回复
怎么都说是这样的....
但我无法看出啊...
BlueDog
2006-03-26
打赏
举报
回复
当然是一样的。因为.net有一个字符串池机制,相同的字符串其指向是相同的。
字符串在比较时,第一个判断是不是相同的引用,因为它们指向字符串池中同一个地址,
当然相同。你如果不信的话可以用Reflector看看其源码
asggg
2006-03-26
打赏
举报
回复
虽然理解不同 但结果都是一样的
但究竟哪个理解才是对的吗
哎 把这个类变得那么怪.
asggg
2006-03-26
打赏
举报
回复
晕
哪本书会写得那么深入 就算MSDN也不会有写的啊
asggg
2006-03-26
打赏
举报
回复
楼上的啊
都不知道事实是否和你说的一样的,很难论证啊
string是一个类啊 .这是它的本质.它也应该符合类的特征吧.我觉得你的解释虽然对不对和结果都无多大联系,但我总觉得不是这样的.我现在觉得是System.Object.Equals方法对string类有特殊的处理就是了
Macosx
2006-03-26
打赏
举报
回复
当然是真 楼主又不好好看书
asggg
2006-03-26
打赏
举报
回复
但new如何使用啊 都没有new(string s)这个构造的
asggg
2006-03-26
打赏
举报
回复
楼上的 真的是这样的吗
如果存在存放有它会检查当前动态分配的字串中是否有这个字串,如果有,则返回引用,否则创建新对象,返回引用。
那是不是说
string s1="abc";//生成空间A
string s2="abc";此时不生成空间,而是把s2直接引用空间A
string s3="a";此时生成空间B
兔子-顾问
2006-03-26
打赏
举报
回复
string是类,但你没发现你没有写new么?
没错。.net对字串处理比较特殊,它会检查当前动态分配的字串中是否有这个字串,如果有,则返回引用,否则创建新对象,返回引用。这里是存在的。自然指向同一个对象了。
加载更多回复(1)
C#
For Unity系列之基础篇
本套《
C#
for Unity》课程共分为“入门篇”、“基础篇”、“中级篇”、“进阶篇”,分别对应于完全“零”编程基础、较少编程基础、需要强化
C#
编程、需要深入学习
C#
脚本,等各
类
型学员群体。 &...
C#
string
与
String
区别
C#
是区分大小写的,但是我却发现
C#
中同时存在
String
与
string
,于是我很困惑,于是我上网搜索了一下,于是我了解了一些小知识。 MSDN中对
string
的说明:
string
is an alias for
String
in the .NET Framework。
string
是
String
的别名而已,
string
是
c#
中的
类
,
String
是Framework的
类
,
C#
string
映射为 Framework的
String
。如果用
string
,编译器会把它编译成
String
,所以如果直接用
C#
中
String
和
string
的区别
1.
string
是
c#
中的
类
,
String
是.net Framework的
类
(在
c#
IDE中不会显示蓝色) ; 2.
c#
string
映射为.net Framework的
String
; 3.如果用
string
,编译器会把它编译成
String
,所以如果直接用
String
就可以让编译器少做一点点工作 ; 4.如果使用
c#
,建议使用
string
,
比较
符合规范 ; 5.
string
始终代表 System.
String
(1.x) 或 ::System.
String
(2.0) ; 6.
String
只有在前面有...
C#
中
string
类
型的常用方法总结
在
C#
语言中,字符串是System.
String
类
的一个引用
类
型,但与其他引用
类
型不同的是,
C#
将字符串视为一个基本
类
型,它可以申请为一个常量,也可以直接给它赋值。由于
C#
中的字符串是由System.
String
类
派生而来的引用对象,因此可以使用
String
类
的方法来对字符串进行各种操作。下面通过几个例子来讲述
String
类
的几个重要方法以及字符串拘留池机构。1、字符串的复制: (1)、Strin
C#
string
字符串
比较
最简单的
比较
方式:
string
str1="Test";
string
str2 = "Test"; if (str1==str2) //第一种判断方式 { //第二种判断方式 ...
C#
110,536
社区成员
642,578
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章