类型比较的问题,比较运算符==

好好学习29 2012-04-25 04:53:39
类:Animals

Animals animalList1 = new Animals();
Animals animalList2 = new Animals();


1.
if(animalList1==animalcule)
{}

animalList1,animalList2是引用类型, 答案是false
2.
string str1 = "3";
string str2 = "3";
if (str1 == str2)
{}
str1,str2也是引用类型,结果怎么是true呢

...全文
198 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
烈火蜓蜻 2012-04-25
  • 打赏
  • 举报
回复
修正一下


2. 在C#中,所有相同的字符串常量,只保留一个内存副本。提高效率。这就是为什么字符串“不可以修改”的原因

string a="3",b="3",c="3";
a,b,c都指向相同的字符串常量,常量字符串"3"引用数为3个

a = "1231";之后
b,c指向字符串常量"3", 常量字符串"3"引用数为2个
系统新创建一个字符串常量"1231",并且a变量指向了它,常量字符串"1231"引用数为1个
烈火蜓蜻 2012-04-25
  • 打赏
  • 举报
回复
引用类型的比较,这个要看具体的情况,不好说为什么相等,
字符串的比较,可以参考以下两个原因中的一个,
1. 因为string类型重载了 == 运算符,使他们比较值,而不仅仅只是比较引用
2. 在C#中,所有相同的字符串,只保留一个副本。提高效率。这就是为什么字符串“不可以修改”的原因


字符串被修改了之后,原来字符串的引用计数被减1,而被修改的字符串变量则指向新的字符串地址。

string a="3",b="3",c="3";

a,b,c都指向了相同的内存地址。因为字符串只有一个副本。
smilereeves 2012-04-25
  • 打赏
  • 举报
回复
string类型重写了Equals()方法,对比时比较的是值,不是地址,就这么简单
好好学习29 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

string 比较默认是按照序号排序规则比较,即Ascii码
引用类型则是按照对象地址看是否引用同一个对象,animalList1==animalcule类似于 Object.ReferenceEquals(animalList1,animalcule)
[/Quote]

string是特殊的引用类型,好了!结贴
好好学习29 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:
引用 3 楼 的回复:

1、对比引用的对象是否相同
2、对比值是否相同


引用类型一般都是比较引用的,不是比较值的对吗!!

那要看是否重载了 ==
[/Quote]

运算符重载吗?
好好学习29 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 11 楼 的回复:
引用 7 楼 的回复:

字符串是特殊的引用类型。出于节省空间,以及优化性能的考虑。
事实上系统内是维护一个类似于字符串池的东西,所有用到的字符串都在里面。相同的字符串其实是公用的同一个对象。


我能这么理解你的话吗?

既然是同一个对象,那我“3”==“4”应该为true

你认为 “3”和“4”是相同的字符串吗?

[/Quote]

不是相同的字符串,可是共用同一个对象呀!!==不就是来比较是否引用自同一个对象吗
种草德鲁伊 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

那要看是否重载了 ==

[/Quote]

确实。
好好学习29 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

string 类型比较特殊,看看.net基础教程就知道了
[/Quote]

xuelang1225 2012-04-25
  • 打赏
  • 举报
回复
string是特殊的引用类型。比较的是值,不是引用地址。
cheng2005 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 7 楼 的回复:

字符串是特殊的引用类型。出于节省空间,以及优化性能的考虑。
事实上系统内是维护一个类似于字符串池的东西,所有用到的字符串都在里面。相同的字符串其实是公用的同一个对象。


我能这么理解你的话吗?

既然是同一个对象,那我“3”==“4”应该为true
[/Quote]
你认为 “3”和“4”是相同的字符串吗?
蔡袅 2012-04-25
  • 打赏
  • 举报
回复
string 比较默认是按照序号排序规则比较,即Ascii码
引用类型则是按照对象地址看是否引用同一个对象,animalList1==animalcule类似于 Object.ReferenceEquals(animalList1,animalcule)
好好学习29 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

字符串是特殊的引用类型。出于节省空间,以及优化性能的考虑。
事实上系统内是维护一个类似于字符串池的东西,所有用到的字符串都在里面。相同的字符串其实是公用的同一个对象。
[/Quote]

我能这么理解你的话吗?

既然是同一个对象,那我“3”==“4”应该为true
smilereeves 2012-04-25
  • 打赏
  • 举报
回复
string 类型比较特殊,看看.net基础教程就知道了
cheng2005 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 3 楼 的回复:

1、对比引用的对象是否相同
2、对比值是否相同


引用类型一般都是比较引用的,不是比较值的对吗!!
[/Quote]
那要看是否重载了 ==
好好学习29 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

1、对比引用的对象是否相同
2、对比值是否相同
[/Quote]

引用类型一般都是比较引用的,不是比较值的对吗!!
cheng2005 2012-04-25
  • 打赏
  • 举报
回复
字符串是特殊的引用类型。出于节省空间,以及优化性能的考虑。
事实上系统内是维护一个类似于字符串池的东西,所有用到的字符串都在里面。相同的字符串其实是公用的同一个对象。
好好学习29 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

难道你不知道string是特殊的引用类型吗?它是按照内容比较的,而不是引用地址。
[/Quote]

不知道 mark一下
好好学习29 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

if(animalList1==animalcule)//animalcule是什么东东?
[/Quote]

1.
if(animalList1==animalList2)
{}
打错了,不好意思
qldsrx 2012-04-25
  • 打赏
  • 举报
回复
难道你不知道string是特殊的引用类型吗?它是按照内容比较的,而不是引用地址。
guanlianan 2012-04-25
  • 打赏
  • 举报
回复
1、对比引用的对象是否相同
2、对比值是否相同
加载更多回复(2)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧