あなたは間違った質問をしていると思います。私の答えは非常に詳細ですが、ここに簡単な要約があります:
id
C#に直接相当するものはありません。
- ポインターを使用して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
本当に悪い考えです。
概要
しないでください。