c# .Net でのオブジェクトの比較について(classの場合)

C#のような .Net 系で、オブジェクトの参照とその扱い方の記述とで、わかりずらかったので整理してみました。

ここでは、実際の内部処理を前提として、どのように操作するとどうなるのか?という順序で分類して書いてみました。

 

※クラスのオブジェクト同士の == での比較は、何を指示しているのかという意味合いの問題があるので、ここでは触れていません。

 

 

 

f:id:koga2020:20191130111849p:plain

クラスの比較

 

 

 

 

class TokyoInfo A = new class TokyoInfo();
class TokyoInfo B = new class TokyoInfo();
class TokyoInfo C = new class TokyoInfo();
class TokyoInfo D = C ;
class USAInfo F = new class USAinfo();
class USAInfo G = new class USAinfo();
class TokyoInfo
class TokyoInfo
class TokyoInfo
class USAInfo
class USAInfo
形状が同じか? same class ?
参照先の内部管理 ID が同じか?
A と同じ値のオブジェクトを作る。
実例: Class K = A . MemberwiseClone();
※さらに参照先のあるタイプ( List<int> やクラスなど )は、さらに同様にして同じ値となるように手書きでの記述が必要です。)
いわゆる【クラス変数 A と B は同じデータか?】
   異なる参照先だけれど、 A と B の参照先の「値」が同じかどうか?
   値ごとに比較するしかない!!
   しかも、参照先のあるタイプ( List<int> やクラスなど )は、さらに同様にして同じ値となるように手書きでの記述が必要です。)
それは手書きで行う。( . Net での用意や仕様は存在しない。)
利用しやすいように関数で作っておく、という手法が基本。
変数名に新しいオブジェクトを作って、紐づけする 例: new class TokyoInfo()
変数名の参照先を他の参照先に変える場合 A = C A の参照先を C の参照先(内部管理 ID 002)にします。
そして A が参照していた内部管理 ID 001 は、それを参照する変数が無い状態となる。
内部管理 ID は知りようがない状態なので、つまりは今後は利用不可能。
これを .Net は独自のタイミングで捨てる(ガベージコレクション
実在するデータの値が同じか?
クラスのプロパティを1つずつ比較する方法  具体例: if ( A . 人数 == B . 人数 )
全てのプロパティが同じ値かまとめて行う   具体例: if ( A . 人数 == B . 人数 )
.Net メモリ上に実在するオブジェクト(データ)
プログラマに見える内容 . Net の内部管理なので、プログラマからは見えない内容
値は A . 人数 と書くことで、プログラマから見えるように
. Net にその趣旨を伝えます。
具体例: C . Equals ( D ) は true 。参照先の内部管理 ID が同じ
具体例: B . Equals ( C ) は false 。参照先の内部管理 ID が異なる
値が同じかどうか(複数の変数があれば、その全てにおいて)
参照先の内部管理 ID と紐付け
変数名(A ~ G)の参照先の内部管理 ID と紐付け