質問

Pythonに相当するC#がありますか id()?そうでない場合、オブジェクトが変更されたかどうかをテストするにはどうすればよいですか?たとえば、Pythonでは、不変のオブジェクト:

>>> s = "abc"
>>> id(s)
11172320
>>> s += "d"
>>> id(s)
18632928

そして可変性:

>>> a = [1, 2, 3]
>>> id(a)
11259656
>>> a += [4]
>>> id(a)
11259656

編集 - これまでの回答のほとんどは 比較関数/演算子 しかし、私は比較されている価値にもっと興味があります。私は最初はそれについて明確ではありませんでした、そして私は受け入れています Object.ReferenceEquals 答えとして。

役に立ちましたか?

解決

さて、あなたはを使用することができます Object.ReferenceEquals() 関数:

指定されたオブジェクトインスタンスが同じインスタンスであるかどうかを決定します。

Pythonの例を少し借りるには:

List<int> listA = new List<int> { 1, 2, 3 };
List<int> listB = listA;
listA.Add(4);

bool equal = object.ReferenceEquals(listA, listB);

equal そうなるでしょう true.

他のヒント

オブジェクトのIDをテストできます Object.ReferenceEquals.

間違った質問をしていると思います。私の答えは非常に詳細ですが、ここに簡単な要約があります:

  • に相当するものはありません id C#で。
  • ポインターを使用してC#でオブジェクトのアドレスを取得できますが、 これを使用しないでください あなたの問題を解決するために。
  • メソッド object.ReferenceEquals あなたがやろうとしていることに似たことをします。
  • あなたが解決しようとしている問題は、同じ方法でC#には実際には存在しません。それはPythonで行うことです。
  • あなたが使用している方法 id Pythonでも問題を解決しません。

まず、から投稿します IDのドキュメント ほとんどの人はそれを読んでいないようです。お願いします 行う 私の答えの残りの部分は何を知っているなら理にかなっているのでこれを読んでください id (そしていいえ、ハッシュコードを作成しません):

オブジェクトの「アイデンティティ」を返します。これは整数(または長い整数)であり、このオブジェクトの生涯に一意で一定であることが保証されています。重複しない寿命の2つのオブジェクトは、同じID()値を持つ場合があります。

cpython実装の詳細:これはオブジェクトのアドレスです。

C#は同等のものではありません id ただし、安全でないモードでオブジェクトへのポインターを取得することにより、オブジェクトのアドレスを取得することができます。

unsafe
{
     IntPtr x = (IntPtr)(&v);
     Console.WriteLine(x);
}

しかしあなた これをするべきではありません C#で。 C#で安全でないコードを使用する必要はほとんどありません。また、コードを呼び出すコードも安全ではないように簡単に広めることができます。安全でないコードを必要としない問題を解決する他の方法があります。その上、.NETでは(Pythonとは異なり)オブジェクトはゴミコレクターによってメモリ内で移動することができます。したがって、オブジェクトの寿命全体にわたって一定のままである単一のアイデンティティが必要な場合、メモリアドレスはあなたには役に立ちません。代わりに、readonlyプロパティを作成する必要があります Id 例えば。


安全でないコードを使用せずにC#で可能な別のアプローチは、2つの変数が同じ参照を使用して同じ参照を持っているかどうかをテストすることです。 Object.ReferenceEquals. 。ただし、おそらくこれを行うべきではありません。 C#は、Pythonと同じあいまいさを持っていません。変数を設定して新しいオブジェクトを指すように使用する = オペレーター。メソッドを呼び出すことはほとんど常に参照を変更しないため、心配する必要はありません。 C#で x += y; オペレーターは(ほぼ)相当します x = x + y そして、あなたはPythonでできるようにそれを変えることはできません。


また、ドキュメントで述べたように、Pythonの例には欠陥があります - id オブジェクトが変更されたかどうかをテストするために確実に使用できません。例:

>>> s='abc'
>>> id(s)
37822208
>>> s+='d'
>>> id(s)
61711680    # Changes
>>> s+='e'
>>> id(s)
61711680    # Oops... doesn't change even though the value changed.

Pythonで2つのオブジェクトを比較して同じオブジェクトであるかどうかを確認する必要がある場合(そしておそらくこれを行うべきではありません)、使用してください。 is これはPythonに相当します object.ReferenceEquals. id オブジェクトの生涯にわたって一定であることのみが保証されています。上記のように idいいえ 異なるオブジェクトで異なることが保証されています。特に、オブジェクトの1つが存在しなくなった場合、あなたは同じものを取得できる(そして時にはそうすることもあります) id 同じメモリの再利用のため。そのようにの使用 id ここでは本当に悪い考えです。

概要

それをしないでください。

object.GetHashcode() ショットの価値があるかもしれません。

wes、あなたの質問に対する正解、すなわち.. id()の類似の関数はです

object.gethashcode()

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top