2007/07/24(Tue) 19:38:13 編集(投稿者)
■No5825 (倉田 有大 さん) に返信
>>(VB の場合は、Class にしないと取得できませんけど)
> なるほど、これは勉強になります。
ボックス化された値型の取り扱いの違いから、VB とC# とでは異なる結果となります。
============================
public struct CSStruct
{
public int Field;
}
static void Main()
{
CSStruct a = new CSStruct();
object b = a;
object c = b;
bool ret1 = object.ReferenceEquals(a, b); // false
bool ret2 = object.ReferenceEquals(c, b); // true;
}
============================
Public Structure VBStruct
Public Field As Integer
End Structure
Shared Sub Main()
Dim a As New VBStruct()
Dim b As Object = a
Dim c As Object = b
Dim ret1 As Boolean = Object.ReferenceEquals(a, b) 'False
Dim ret2 As Boolean = Object.ReferenceEquals(c, b) 'False
End Sub
============================
IL を読むと、VB では RuntimeHelpers.GetObjectValue の呼び出しが逐次発生していることを確認できます。
> VBは無理なんですか。
同じ手順では無理、ということです。VB で Structure LOGFONT であっても、たとえば
Byte 配列等に Font.ToLogFont させてから、IntPtr 経由で PtrToStructure などすれば取れます。
# もっと簡単に取得する方法もあるのかな……?
まぁ、Class LOGFONT にしておいた方が無難ですけれどね。