GCHandleクラス
提供:AB開発Wiki
ナビゲーションに移動検索に移動
GCHandle クラスは、オブジェクトに対するハンドルを獲得し、それを保持するクラスです。またハンドル値を取り出したり、取り出したハンドル値からGCHandleオブジェクトに戻したりもできます。
クラスのメンバ
公開プロパティ
Target
GCHandleが保持するハンドルが指すオブジェクトを参照します。
Function Target() As Object Sub Target(obj As Object)
IsAllocated
このGCHandleがハンドルを保持しているかを返します。
Const Function IsAllocated() As Boolean
- 戻り値
- ハンドルを保持していればTrue、そうでなければFalse。
公開メソッド
Alloc
オブジェクトにハンドルを割り当てます。
Static Function Alloc(obj As Object) As GCHandle
- obj
- ハンドルを割り当てたいオブジェクト
- 戻り値
- ハンドルが割り当てられたGCHandleインスタンス
戻り値のGCHandleの割り当てが不要になったら必ずFreeを呼び出してください。
Free
ハンドルの割り当てを解除します。
Sub Free()
ToIntPtr
ハンドル値を取り出します。
Static Function ToIntPtr(h As GCHandle) As LONG_PTR
- h
- GCHandleインスタンス
- 戻り値
- ハンドル値
FromIntPtrを使うと、ToIntPtrの戻り値のハンドルから、GCHandleオブジェクトを取り出せます。
FromIntPtr
ハンドル値からGCHandleインスタンスへ戻します。
Static Function FromIntPtr(handle As LONG_PTR) As GCHandle
- handle
- ToIntPtrが返したハンドル値
- 戻り値
- GCHandleインスタンス
GetHashCode
ハッシュコードを得ます。
Override Function GetHashCode() As Long
Equals
等しいハンドルかどうか比較をします。
Function Equals(y As GCHandle) As Boolean
- y
- 比較対象
- 戻り値
- このインスタンスとyが同じハンドルを保持していればTrue、そうでなければFalse
x.ToIntPtr() = y.ToIntPtr()ならx.Equals(y) = Trueです。しかし、同一オブジェクトを指す場合でもハンドルが異なる場合は等しいとされません。言い換えるとObject.ReferenceEquals(x.Target, y.Target) = Trueであってもx.Equals(y) = Trueとは限りません。
等価演算子
等しいハンドルかどうか比較をします。
Function Operator == (y As GCHandle) As Boolean
- y
- 比較対象
- 戻り値
- Equals(y)
非等価演算子
等しくないハンドルかどうか比較をします。
Function Operator == (y As GCHandle) As Boolean
- y
- 比較対象
- 戻り値
- Not Equals(y)
例
#prompt
#require <Classes/System/Runtime/InteropServices/GCHandle.ab>
Class Test
Public
Sub Test(name As String)
s = name
Print "Constractor", s
End Sub
Sub ~Test()
Print "Destractor", s
End Sub
Private
s As String
End Class
Dim ret = f()
GC_malloc(1024 * 1024 * 2)
Dim o = New Object 'スイープ実行
Print "After Sweep"
Dim gch = GCHandle.FromIntPtr(ret)
Dim tama = gch.Target
'gch.Free()
'End
Sleep(-1)
Function f() As LONG_PTR
Dim p = New Test("Pochi")
Dim t = New Test("Tama")
Dim gch = GCHandle.Alloc(t)
Return GCHandle.ToIntPtr(gch)
End Function
上のコードを実行すると次のような出力となり、関数fを抜けてTamaを参照するオブジェクトが無くなっても、ガベージコレクタによって回収されないことがわかります(最終的にはプロンプトウィンドウを閉じてプログラムが終了するときにTamaのデストラクタが実行されます)。
Constractor Pochi Constractor Tama Destractor Pochi After Sweep