[副贴]一些疑惑,关于小猪妹的... 原贴: http://expert.csdn.net/Expert/topic/2902/2902022.xml?temp=.2027246

SaSBYa 2004-04-02 09:19:55
谢谢:SolidGL(雍软(珠海)研发中心核心成员)

同样谢谢:hyifeng() ,loulanlouzhu(桃花潭水深千尺,不及阿勇念你情),aspcn(飞刀),SimerJoe(浪月), zhouqi66(部落),c5n()

请来此取分.偶分不多了,不好意思,只能放个100了


如果可以的话,大家继续讨论..............

...全文
33 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tavor 2004-04-02
  • 打赏
  • 举报
回复
我记得看过一篇文章,不记得是说JAVA还是C#了,

说string类型的equals比较是值,而==比较是引用地址比较,我想这对引用类型来说都是适用的,而值类型的==就是值比较了。

而object类型是一切类型的祖类,无论是引用类型还是值类型都由其派生,其类型也许可称其为引用类型或亦可称其为值类型,因而在比较其对象时,无论用equals or ==应该都可以说是正确的。

小弟才疏学浅,在此乱发一通,还望各高手别见怪
loulanlouzhu 2004-04-02
  • 打赏
  • 举报
回复
现在出差!

回去再研究!


谢谢送分!
HNU 2004-04-02
  • 打赏
  • 举报
回复


我昨天刚想和你们讨论,就结贴了,谢谢楼主的肯定,我打那么多字也值得了 :)




回复人: SaSBYa(转变作风,重新开始,做自己的框架库) ( ) 信誉:100 2004-04-01 16:08:00 得分:0


To: HNU(為楚有材,於斯為盛!)
你的例子写的不错,注释的很好


真想把这个贴子改成示结的贴子.


不过,说实话 .Net 的内存管理同想象中的真是不一样.或者说,还不全是同一概念.







没看那些星星讲什么,只是箱进来和大家讨论讨论,探讨才能进步。

using System;
class Test
{
static void Main() {
string s = "Test";
string t = string.Copy(s);
Console.WriteLine(s == t);
Console.WriteLine((object)s == (object)t);
}
}
produces the outputTrue

True
False


上面的代码实际相当于下面:



string s = "Test";
string t = string.Copy(s);
object so = s;
object to = t;
Console.WriteLine(s == t);
Console.WriteLine(so == to);

True
False





True

// “==”string类(.NET对string类如值类型处理),进行值类型的操作,就像比较int一样比较内存中的“堆栈”,由于两个都是"Test",显然为True


False

//由于(object)s 和(object)t 为两次不同的装箱操作,并且string s 和 string t 在内存“堆”中两个副本的地址不同(但是 string s 和 string t 在“堆栈”中的原始值相同)。对于一般的类如object 类,== 表示比较引用,看是否指向内存(这里指内存中的“堆”,也就是存放副本的地方)中同一个地址。显然为False;





//////////// 最最重要的一点是string.Copy()方法!! /////////////////

string str1 = "Test";
string str2 = str; (str1 = "Test"也是一样)
//上面实际相当于引用,指向str1的内容,内存中只有一个"Test"
object s = str1;
object t = str2;
Console.WriteLine(s == t);

结果为:True


但是下面用了Copy();

string str1 = "Test";
string str2 = string.Copy(str1);//“深层”复制!内存中将有两个"Test"!
object s = str1;
object t = str2;
Console.WriteLine(s == t);



如 bject o = (object) i;这样的显式执行装箱是毫无必要的




turnmissile 2004-04-02
  • 打赏
  • 举报
回复
// Console.WriteLine((string)s == (string)t);
这句使用的是string的==操作符。做的是字符串比较
// Console.WriteLine((object)s == (object)t);
这里强制使用object的==比较,使用的refernce地址的比较啊!

我也觉得很奇怪,为什么会是这样的结果。可能是因为string是基本类型的数据,而prime data和object在进行boxing的时候有些许的不同吧!但是用ToString()的结果又是正确的。等一下看看他的il再说。

另外还有一种可能是在string定义他的== operation的时候,使用了new keywork。这样也会造成这种结果。

hunterzhi 2004-04-02
  • 打赏
  • 举报
回复
能给我不?
SimerJoe 2004-04-02
  • 打赏
  • 举报
回复
来了,我要分。
SaSBYa 2004-04-02
  • 打赏
  • 举报
回复
原贴: http://expert.csdn.net/Expert/topic/2902/2902022.xml?temp=.2027246
o1o 2004-04-02
  • 打赏
  • 举报
回复
我看过一本书,照书上的答案那结果应该是“False”(最后一句)。
o1o 2004-04-02
  • 打赏
  • 举报
回复
哈哈,结贴的方式倒也是很细心啊。
zhouqi66 2004-04-02
  • 打赏
  • 举报
回复
多谢楼主,接点分先。
turnmissile 2004-04-02
  • 打赏
  • 举报
回复
to tavor(龙双公子):
没有错,java中的==就是比较地址,但是这个在c#中,就不是这样了,object的定义是比较reference,其他的基本都有自己的定义, 如string就是进行字符串比较。

110,571

社区成员

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

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

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