GCHandleクラス

提供:AB開発Wiki
2007年4月18日 (水) 12:46時点におけるEgtra (トーク | 投稿記録)による版 (→‎Equals: ReferenceEqualsを使って書き換え)
ナビゲーションに移動検索に移動

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