4

Pythonのid()に相当するC#はありますか?そうでない場合、オブジェクトが変更されたかどうかをテストするにはどうすればよいですか?たとえば、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答えとして受け入れています。

4

5 に答える 5

5

を使用してオブジェクトIDをテストできますObject.ReferenceEquals

于 2010-12-09T15:36:40.817 に答える
4

さて、あなたは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

于 2010-12-09T15:36:27.370 に答える
4

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

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

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

オブジェクトの「ID」を返します。これは整数(または長整数)であり、このオブジェクトの存続期間中、一意で一定であることが保証されています。ライフタイムが重複しない2つのオブジェクトは、同じid()値を持つ場合があります。

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

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

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

ただし、C#ではこれを行うべきではありません。C#で安全でないコードを使用する必要はほとんどありません。使用すると、コードを呼び出すコードも安全でなくなるため、簡単に拡散する可能性があります。安全でないコードを必要としない問題を解決する他の方法があります。さらに、.NETでは(Pythonとは異なり)、オブジェクトはガベージコレクターによってメモリ内で移動できるため、オブジェクトの存続期間全体にわたって一定のままである単一のIDが必要な場合は、メモリアドレスは役に立ちません。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本当に悪い考えです。

概要

しないでください。

于 2010-12-09T15:36:55.317 に答える
3

object.GetHashcode()一撃の価値があるかもしれません。

于 2010-12-09T15:37:02.423 に答える
0

wes、あなたの質問に対する正解、つまりid()に類似した関数は

object.GetHashCode()

于 2010-12-09T17:52:46.407 に答える