2

キーワードを使用せずに変数のアドレスを取得するにはC#どうすればよいですか。unsafeアドレスを変更したり、アクセスしたりしたくありません。ただその場所を知っているだけです。

4

3 に答える 3

17

できません。
そして、住所が固定されていないため、正当な理由があります。これは、CLR のメモリ管理によって移動できます。

于 2013-07-11T12:43:54.933 に答える
7

.NET はマネージ メモリ内の変数を常に移動しているため、変数を「固定」してから、次のコマンドでその場所を取得する必要がありますGCHandle

static void Main()
{

    string myVar = "This is my string";

    GCHandle handle = GCHandle.Alloc(myVar, GCHandleType.Pinned);
    IntPtr pointer = GCHandle.ToIntPtr(handle);

    Console.WriteLine(pointer);

    handle.Free();

}

ただし、これは実際には元の変数をによって参照される新しい場所に移動すると思います。すべての型で機能するわけではなく、blittable型のみで機能します。GCHandle

于 2013-07-11T12:47:29.803 に答える
4

アドレスを抽出する前に、オブジェクトを固定する必要があります。それ以外の場合、GC は自由に移動できます。

object variable = new object();
GCHandle handle = GCHandle.Alloc(variable, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();

通常、これは、ある種の管理されていない相互運用を必要とするシナリオでのみ行います。ただし、それでも、この種の手動操作が必要になることはめったにありません。

于 2013-07-11T12:51:50.863 に答える