日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# equals与==的区别【转】

發(fā)布時間:2025/4/14 C# 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# equals与==的区别【转】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
對于值類型,如果對象的值相等,則相等運算符 (==) 返回 true,否則返回 false。對于string 以外的引用類型,如果兩個對象引用同一個對象,則 == 返回 true。對于 string 類型,== 比較字符串的值。
??? ==操作比較的是兩個變量的值是否相等。
??? equals()方法比較的是兩個對象的內(nèi)容是否一致.equals也就是比較引用類型是否是對同一個對象的引用。
??? 對于值類型的比較,這里就不做描述了,下面討論引用類型的比較:
首先我們看一段程序
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?ConsoleApplication1
{
????
class?Person
????
{
????????
private?string?name;

????????
public?string?Name
????????
{
????????????
get?{?return?name;?}
????????????
set?{?name?=?value;?}
????????}


????????
public?Person(string?name)
????????
{
????????????
this.name?=?name;
????????}

????}

}

using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?ConsoleApplication1
{
????
class?Program
????
{
????????
static?void?Main(string[]?args)
????????
{
????????????
string?a?=?new?string(new?char[]?{?'h',?'e',?'l',?'l',?'o'?});
????????????
string?b?=?new?string(new?char[]?{?'h',?'e',?'l',?'l',?'o'?});
????????????Console.WriteLine(a?
==?b);
????????????Console.WriteLine(a.Equals(b));

????????????
object?g?=?a;
????????????
object?h?=?b;
????????????Console.WriteLine(g?
==?h);
????????????Console.WriteLine(g.Equals(h));

????????????Person?p1?
=?new?Person("jia");
????????????Person?p2?
=?new?Person("jia");
????????????Console.WriteLine(p1?
==?p2);
????????????Console.WriteLine(p1.Equals(p2));


????????????Person?p3?
=?new?Person("jia");
????????????Person?p4?
=?p3;
????????????Console.WriteLine(p3?
==?p4);
????????????Console.WriteLine(p3.Equals(p4));

????????????Console.ReadLine();
????????}

????}

}

運行程序,會輸出什么呢?
答案是 true,true,false,true,false,false,true,true。
為什么會出現(xiàn)這個答案呢?因為值類型是存儲在內(nèi)存中的堆棧(以后簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在堆中。
??? ==操作比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內(nèi)容是否相同。
??? equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的內(nèi)容是否相同。
??? 而字符串是一個特殊的引用型類型,在C#語言中,重載了string 對象的很多方法方法(包括equals()方法),使string對象用起來就像是值類型一樣。
??? 因此在上面的例子中,字符串a(chǎn)和字符串b的兩個比較是相等的。
??? 對于object g 和object h?時內(nèi)存中兩個不同的對象,所以在棧中的內(nèi)容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果將字符串a(chǎn)和b作這樣的修改:
??????? string a="aa";
??????? string b="aa";
則,g和h的兩個比較都是相等的。這是因為系統(tǒng)并沒有給字符串b分配內(nèi)存,只是將"aa"指向了b。所以a和b指向的是同一個字符串(字符串在這種賦值的情況下做了內(nèi)存的優(yōu)化)。
對于p1和p2,也是內(nèi)存中兩個不同的對象,所以在內(nèi)存中的地址肯定不相同,故p1==p2會返回false,又因為p1和p2又是對不同對象的引用,所以p1.equals(p2)將返回false。
對于p3和p4,p4=p3,p3將對對象的引用賦給了p4,p3和p4是對同一個對象的引用,所以兩個比較都返回true。
如果我們對person的equals方法重寫:
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?ConsoleApplication1
{
????
class?Person
????
{
????????
private?string?name;

????????
public?string?Name
????????
{
????????????
get?{?return?name;?}
????????????
set?{?name?=?value;?}
????????}


????????
public?Person(string?name)
????????
{
????????????
this.name?=?name;
????????}


????????
public?override?bool?Equals(object?obj)
????????
{
????????????
if?(!(obj?is?Person))
????????????????
return?false;
????????????Person?per?
=?(Person)obj;
????????????
return?this.Name?==?per.Name;
????????}

????}

}

那么p1.equals(p2),就會返回true。

?

轉載:http://www.cnblogs.com/jiahaipeng/archive/2008/04/11/1146316.html

補充:

名稱 說明
Object.Equals (Object) 確定指定的 Object 是否等于當前的 Object

由 .NET Compact Framework 支持。

Object.Equals (Object, Object) 確定指定的 Object 實例是否被視為相等。

由 .NET Compact Framework 支持。

轉載于:https://www.cnblogs.com/lgxjt168/archive/2008/08/25/1276077.html

總結

以上是生活随笔為你收集整理的c# equals与==的区别【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。