2011-12-21T22:08:30の更新内容

programming/netfx/enumeration/index.wiki.txt

current previous
1078,183 1078,6
 

        

        
 
----
----
 

        

        
+
*列挙操作中のコレクションの変更
+
ArrayListをはじめ、List, Queue, Dictionaryなど、動的に要素を追加・削除できるコレクションをforeach文/For Eachステートメントで列挙する場合、列挙中に追加・削除等の操作を行うことはできません。 これらの操作を行おうとすると例外&msdn(netfx,type,System.InvalidOperationException){InvalidOperationException};がスローされます。 これは列挙中のコレクションの状態が変わることで列挙子が指す要素の位置が変わることにより列挙子が無効となり、正しい列挙操作を継続できなくなるためです。
+

          
+
例として、いくつかの数値が格納されたListから奇数のみを削除するために次のようなコードを書いた場合、InvalidOperationExceptionがスローされます。
+

          
+
#tabpage(C#)
+
#code(cs,列挙操作が無効になる例){{
+
using System;
+
using System.Collections.Generic;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    List<int> list = new List<int>(new int[] {1, 2, 3, 4, 5, 6, 7});
+

          
+
    // Listから奇数の要素を削除したい
+
    foreach (int val in list) {
+
      if (val % 2 != 0)
+
        list.Remove(val); // InvalidOperationExceptionがスローされる
+
    }
+

          
+
    // 結果を表示
+
    foreach (int val in list) {
+
      Console.Write("{0}, ", val);
+
    }
+
    Console.WriteLine();
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,列挙操作が無効になる例){{
+
Imports System
+
Imports System.Collections.Generic
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim list As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7})
+

          
+
    ' Listから奇数の要素を削除したい
+
    For Each val As Integer In list
+
      If val Mod 2 <> 0 Then list.Remove(val) ' InvalidOperationExceptionがスローされる
+
    Next
+

          
+
    ' 結果を表示
+
    For Each val As Integer In list
+
      Console.Write("{0}, ", val)
+
    Next
+
    Console.WriteLine()
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
ハンドルされていない例外: System.InvalidOperationException: コレクションが変更されました。列挙操作は実行されない可能性があります。
+
   場所 System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
+
   場所 System.Collections.Generic.List`1.Enumerator.MoveNextRare()
+
   場所 System.Collections.Generic.List`1.Enumerator.MoveNext()
+
   場所 Sample.Main()
+
}}
+

          
+
これを回避するには、foreachによる列挙中はコレクションを変更しないようにするしかありません。 一つの代替方法に、for文などを使いインデックスを指定してコレクションを列挙・変更する方法があります。 この方法では、コレクションを変更することにより列挙中の要素のインデックスが変わる場合がある点に注意が必要です。 先の例を、for文/Do Whileステートメントを使って書き換えると次のようになります。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Collections.Generic;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    List<int> list = new List<int>(new int[] {1, 2, 3, 4, 5, 6, 7});
+

          
+
    // Listから奇数の要素を削除したい
+
    for (int index = 0; index < list.Count; index++) {
+
      if (list[index] % 2 != 0)
+
        list.RemoveAt(index);
+
    }
+

          
+
    // 結果を表示
+
    foreach (int val in list) {
+
      Console.Write("{0}, ", val);
+
    }
+
    Console.WriteLine();
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Collections.Generic
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim list As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7})
+

          
+
    ' Listから奇数の要素を削除したい
+
    Dim i As Integer = 0
+

          
+
    Do
+
      If list(i) Mod 2 <> 0 Then list.RemoveAt(i)
+

          
+
      i += 1
+
    Loop While i < list.Count
+

          
+
    ' 結果を表示
+
    For Each val As Integer In list
+
      Console.Write("{0}, ", val)
+
    Next
+
    Console.WriteLine()
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
2, 4, 6, 
+
}}
+

          
+
もう一つは、元のコレクションには変更を加えず、別のコレクションを用意してそこに結果を格納する方法です。 この方法の場合、元のコレクションには変更を加えないため、foreach文/For Eachステートメントでの列挙中でも例外はスローされません。 先の例ではリストから奇数の要素を削除するようにしていましたが、次のコードでは奇数以外の要素(つまり偶数)を別のリストに格納することで同等の結果を得られるようにしています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Collections.Generic;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    List<int> list = new List<int>(new int[] {1, 2, 3, 4, 5, 6, 7});
+

          
+
    // Listから奇数の要素を削除したい
+
    List<int> result = new List<int>(); // 結果を格納するList
+

          
+
    foreach (int val in list) {
+
      if (val % 2 == 0)
+
        result.Add(val); // 偶数の場合、結果のListに追加
+
    }
+

          
+
    // 結果を表示
+
    foreach (int val in result) {
+
      Console.Write("{0}, ", val);
+
    }
+
    Console.WriteLine();
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Collections.Generic
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim list As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7})
+

          
+
    ' Listから奇数の要素を削除したい
+
    Dim result As New List(Of Integer) ' 結果を格納するList
+

          
+
    For Each val As Integer In list
+
      If val Mod 2 = 0 Then result.Add(val) ' 偶数の場合、結果のListに追加
+
    Next
+

          
+
    ' 結果を表示
+
    For Each val As Integer In result
+
      Console.Write("{0}, ", val)
+
    Next
+
    Console.WriteLine()
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
2, 4, 6, 
+
}}
+

          
 
*IEnumerable・IEnumeratorを実装しない型の列挙
*IEnumerable・IEnumeratorを実装しない型の列挙
 
ここまでの解説では、列挙を行うためにはIEnumerableを実装する必要があるとしてきました。 しかし実際には、C#のforeach文、VBのFor EachステートメントではIEnumerableを実装していない型でも列挙操作を行うことが出来ます。 以下は、IEnumerable・IEnumeratorを実装していないクラスで列挙操作を行う例です。
ここまでの解説では、列挙を行うためにはIEnumerableを実装する必要があるとしてきました。 しかし実際には、C#のforeach文、VBのFor EachステートメントではIEnumerableを実装していない型でも列挙操作を行うことが出来ます。 以下は、IEnumerable・IEnumeratorを実装していないクラスで列挙操作を行う例です。
 

        

        

programming/netfx/structlayout_fieldoffset/index.wiki.txt

current previous
6,7 6,6
 
.NET Framework の共通言語仕様(CLS)には共用体(C/C++のunion)は存在しません。 また、C#にもVB.NETにも共用体は存在しません。 共用体自体はそれほど使う機会が多いというわけではないですし、また、なければならないというものでもありません。 しかし、ごく稀にあると便利かなと思うことがあります。 そういうときに、.NET Frameworkの&msdn(netfx,type,System.Runtime.InteropServices.StructLayoutAttribute){StructLayout};属性と&msdn(netfx,type,System.Runtime.InteropServices.FieldOffsetAttribute){FieldOffset};属性を用いることでC#やVB.NETの構造体でも共用体の機能を再現することができます。
.NET Framework の共通言語仕様(CLS)には共用体(C/C++のunion)は存在しません。 また、C#にもVB.NETにも共用体は存在しません。 共用体自体はそれほど使う機会が多いというわけではないですし、また、なければならないというものでもありません。 しかし、ごく稀にあると便利かなと思うことがあります。 そういうときに、.NET Frameworkの&msdn(netfx,type,System.Runtime.InteropServices.StructLayoutAttribute){StructLayout};属性と&msdn(netfx,type,System.Runtime.InteropServices.FieldOffsetAttribute){FieldOffset};属性を用いることでC#やVB.NETの構造体でも共用体の機能を再現することができます。
 

        

        
 
-関連するページ
-関連するページ
+
--[[programming/netfx/basictypes]]
 
--[[programming/netfx/attributes]]
--[[programming/netfx/attributes]]
 
--[[programming/netfx/classlibrary]]
--[[programming/netfx/classlibrary]]
 

        

        
20,7 19,7
 

        

        
 
LayoutKind.Explicitを指定した場合は、全てのメンバ変数に対して明示的に位置を指定しなければなりません。 メンバ変数の位置を指定するために使用する属性が&msdn(netfx,type,System.Runtime.InteropServices.FieldOffsetAttribute){FieldOffset};属性です。 この属性では構造体の先頭からのオフセット値をバイト単位で指定します。
LayoutKind.Explicitを指定した場合は、全てのメンバ変数に対して明示的に位置を指定しなければなりません。 メンバ変数の位置を指定するために使用する属性が&msdn(netfx,type,System.Runtime.InteropServices.FieldOffsetAttribute){FieldOffset};属性です。 この属性では構造体の先頭からのオフセット値をバイト単位で指定します。
 

        

        
~
それでは、早速これらの属性を適用した構造体を作成してみようと思います。 このサンプルではshortではなく System.UInt16を用いていますが、16Bitの符号無し整数型を用いていると言うことを明かにするためであって、それ以上の意味はありません。
それでは、早速これらの属性を適用した構造体を作成してみようと思います。 このサンプルではshortではなく System.UInt16を用いていますが、16Bitの符号無し整数型を用いていると言うことを視覚的に表すためであって、それ以上の意味はありません。
 
#tabpage(C#)
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
53,9 52,6
 
    Console.WriteLine("SampleStruct.Value2 : 0x" + s.Value2.ToString("X4"));
    Console.WriteLine("SampleStruct.Value2 : 0x" + s.Value2.ToString("X4"));
 
    Console.WriteLine("SampleStruct.Value3 : 0x" + s.Value3.ToString("X4"));
    Console.WriteLine("SampleStruct.Value3 : 0x" + s.Value3.ToString("X4"));
 
    Console.WriteLine("SampleStruct.Value4 : 0x" + s.Value4.ToString("X4"));
    Console.WriteLine("SampleStruct.Value4 : 0x" + s.Value4.ToString("X4"));
+

          
+
    // 構造体のサイズを表示
+
    Console.WriteLine("SizeOf(SampleStruct) = {0}", Marshal.SizeOf(typeof(SampleStruct)));
 
  }
  }
 
}
}
 
}}
}}
88,9 84,6
 
    Console.WriteLine("SampleStruct.Value2 : 0x" + s.Value2.ToString("X4"))
    Console.WriteLine("SampleStruct.Value2 : 0x" + s.Value2.ToString("X4"))
 
    Console.WriteLine("SampleStruct.Value3 : 0x" + s.Value3.ToString("X4"))
    Console.WriteLine("SampleStruct.Value3 : 0x" + s.Value3.ToString("X4"))
 
    Console.WriteLine("SampleStruct.Value4 : 0x" + s.Value4.ToString("X4"))
    Console.WriteLine("SampleStruct.Value4 : 0x" + s.Value4.ToString("X4"))
+

          
+
    ' 構造体のサイズを表示
+
    Console.WriteLine("SizeOf(SampleStruct) = {0}", Marshal.SizeOf(GetType(SampleStruct)))
 
  End Sub
  End Sub
 
End Class
End Class
 
}}
}}
101,7 94,6
 
SampleStruct.Value2 : 0x3344
SampleStruct.Value2 : 0x3344
 
SampleStruct.Value3 : 0x5566
SampleStruct.Value3 : 0x5566
 
SampleStruct.Value4 : 0x7788
SampleStruct.Value4 : 0x7788
+
SizeOf(SampleStruct) = 8
 
Press any key to continue
Press any key to continue
 
}}
}}
 

        

        
111,7 103,7
 
LayoutKind.ExplicitではなくLayoutKind.Sequentialを指定した場合、&msdn(netfx,member,System.Runtime.InteropServices.StructLayoutAttribute.Pack){StructLayoutAttribute.Packフィールド};で構造体のアライメントを指定することも出来ますが、詳細はここでは省略します。
LayoutKind.ExplicitではなくLayoutKind.Sequentialを指定した場合、&msdn(netfx,member,System.Runtime.InteropServices.StructLayoutAttribute.Pack){StructLayoutAttribute.Packフィールド};で構造体のアライメントを指定することも出来ますが、詳細はここでは省略します。
 

        

        
 
*共用体を作る
*共用体を作る
~
このように、StructLayout属性で明示的にメンバ変数の配置方法を指定することができ、FieldOffsetでメンバ変数のオフセット値を指定することが出来るとなれば、共用体を作る方法はおのずと浮かんでくるはずです。 共用体では一つ以上のメンバ変数が、同じメモリ領域を共用します。 つまり、メンバ変数のオフセット値を全て同じにすれば、共用体と同じ構造の構造体を作ることができることになります。
このように、StructLayout属性で明示的にメンバ変数の配置方法を指定することができ、FieldOffsetでメンバ変数のオフセット値を指定することが出きるとなれば、共用体を作る方法はおのずと浮かんでくるはずです。 共用体では一つ以上のメンバ変数が、同じメモリ領域を共用します。 つまり、メンバ変数のオフセット値を全て同じにすれば、共用体と同じ構造の構造体を作ることができることになります。
 

        

        
 
#tabpage(C#)
#tabpage(C#)
 
#code(cs){{
#code(cs){{
140,9 132,6
 
    // 下位ワードと上位ワードを表示
    // 下位ワードと上位ワードを表示
 
    Console.WriteLine(" Low word: 0x" + dw.LowWord.ToString("X4"));
    Console.WriteLine(" Low word: 0x" + dw.LowWord.ToString("X4"));
 
    Console.WriteLine("High word: 0x" + dw.HighWord.ToString("X4"));
    Console.WriteLine("High word: 0x" + dw.HighWord.ToString("X4"));
+

          
+
    // 構造体のサイズを表示
+
    Console.WriteLine("SizeOf(DoubleWord) = {0}", Marshal.SizeOf(typeof(DoubleWord)));
 
  }
  }
 
}
}
 
}}
}}
170,9 159,6
 
    ' 各フィールドの値を表示
    ' 各フィールドの値を表示
 
    Console.WriteLine(" Low word: 0x" + dw.LowWord.ToString("X4"))
    Console.WriteLine(" Low word: 0x" + dw.LowWord.ToString("X4"))
 
    Console.WriteLine("High word: 0x" + dw.HighWord.ToString("X4"))
    Console.WriteLine("High word: 0x" + dw.HighWord.ToString("X4"))
+

          
+
    ' 構造体のサイズを表示
+
    Console.WriteLine("SizeOf(DoubleWord) = {0}", Marshal.SizeOf(GetType(DoubleWord)))
 
  End Sub
  End Sub
 
End Class
End Class
 
}}
}}
181,7 167,6
 
#prompt(実行結果){{
#prompt(実行結果){{
 
 Low word: 0x3344
 Low word: 0x3344
 
High word: 0x1122
High word: 0x1122
+
SizeOf(DoubleWord) = 4
 
Press any key to continue
Press any key to continue
 
}}
}}
 

        

        
214,8 199,6
 
  cout << " Low word: 0x" << hex << dw.DWord.LowWord << endl;
  cout << " Low word: 0x" << hex << dw.DWord.LowWord << endl;
 
  cout << "High word: 0x" << hex << dw.DWord.HighWord << endl;
  cout << "High word: 0x" << hex << dw.DWord.HighWord << endl;
 

        

        
+
  cout << "sizeof(DoubleWord) = " << sizeof(DoubleWord) << endl;
+

          
 
  return 0;
  return 0;
 
}
}
 
}}
}}

programming/netfx/basictypes/index.wiki.txt

current previous
1,15 1,9
 
${smdncms:title,基本的なデータ型}
${smdncms:title,基本的なデータ型}
~
${smdncms:keywords,基本型,データ型,サイズ,バイト,ビット,桁,値域,範囲,最大値,最小値}
${smdncms:keywords,基本型,データ型,サイズ,桁,値域,範囲,最大値,最小値}
 
${smdncms:document_versions,codelang=cs,codelang=vb}
${smdncms:document_versions,codelang=cs,codelang=vb}
 

        

        
 
ここでは.NET Frameworkに用意されている基本的なデータ型について解説します。
ここでは.NET Frameworkに用意されている基本的なデータ型について解説します。
 

        

        
+
-関連するページ
+
--[[programming/netfx/conversion]]
+
---[[programming/netfx/conversion/0_basetype]]
+
--[[programming/netfx/mathematics]]
+
---[[programming/netfx/mathematics/0_math]]
+

          
 
#googleadunit(banner)
#googleadunit(banner)
 

        

        
 
*基本的なデータ型と各言語の型
*基本的なデータ型と各言語の型
86,188 80,7
 
|&msdn(netfx,type,System.DateTimeOffset);|最小 0001年1月1日 00:00:00 (+00:00) ~ 最大 9999年12月31日 23:59:59 (+00:00)&br;オフセット値は最小-14時間 ~ 最大+14時間|100ナノ秒単位|
|&msdn(netfx,type,System.DateTimeOffset);|最小 0001年1月1日 00:00:00 (+00:00) ~ 最大 9999年12月31日 23:59:59 (+00:00)&br;オフセット値は最小-14時間 ~ 最大+14時間|100ナノ秒単位|
 
|&msdn(netfx,type,System.TimeSpan);|最小 -10675199日02時間48分05.4775808秒 ~ 最大 10675199日02時間48分05.4775807秒&br;(Int64の最大値・最小値×100ナノ秒)|100ナノ秒単位|
|&msdn(netfx,type,System.TimeSpan);|最小 -10675199日02時間48分05.4775808秒 ~ 最大 10675199日02時間48分05.4775807秒&br;(Int64の最大値・最小値×100ナノ秒)|100ナノ秒単位|
 

        

        
+
**Int32, Int64と32ビット・64ビット環境
+
.NET Frameworkでは、Int32(int/Integer)およびInt64(long/Long)は、''実行環境が32ビットか64ビットかどうかに関わらず、常に32ビット・64ビット''のサイズとなります。 これは他の整数型も同様です。 一方で、IntPtrおよびUIntPtrは''実行環境が32ビットならサイズが32ビット、実行環境が64ビットならサイズが64ビット''に変わります。 そのため、プラットフォームに依存しない固定長のフィールド等にはInt32・Int64を使用し、プラットフォームAPI呼び出し等で使用するハンドルやポインタ型にはIntPtr・UIntPtrを使用するといった使い分けをします。
+

          
+
&msdn(netfx,member,System.IntPtr.Size){IntPtr.Sizeプロパティ};が返すIntPtrのバイト数を調べることにより、プラットフォームが32ビットか64ビットかを判断することが出来ます。 32ビットならSizeプロパティの値が4、64ビットなら8となります。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    if (IntPtr.Size == 4)
+
      Console.WriteLine("32bit");
+
    else if (IntPtr.Size == 8)
+
      Console.WriteLine("64bit");
+
    else
+
      Console.WriteLine("?");
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    If IntPtr.Size = 4 Then
+
      Console.WriteLine("32bit")
+
    Else If IntPtr.Size = 8 Then
+
      Console.WriteLine("64bit")
+
    Else
+
      Console.WriteLine("?")
+
    End If
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
.NET Framework 4からは&msdn(netfx,member,System.Environment.Is64BitProcess){Environment.Is64BitProcessプロパティ};および&msdn(netfx,member,System.Environment.Is64BitOperatingSystem){Environment.Is64BitOperatingSystemプロパティ};が追加されているので、これを参照することも出来ます。 Is64BitProcessプロパティは自プロセスが64ビットで動作しているかどうか、Is64BitOperatingSystemは実行しているOSが64ビットで動作しているかどうかを返します。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    if (Environment.Is64BitProcess)
+
      Console.WriteLine("64bit process");
+
    else
+
      Console.WriteLine("32bit process?");
+

          
+
    if (Environment.Is64BitOperatingSystem)
+
      Console.WriteLine("64bit OS");
+
    else
+
      Console.WriteLine("32bit OS?");
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    If Environment.Is64BitProcess Then
+
      Console.WriteLine("64bit process")
+
    Else
+
      Console.WriteLine("32bit process?")
+
    End If
+

          
+
    If Environment.Is64BitOperatingSystem
+
      Console.WriteLine("64bit OS")
+
    Else
+
      Console.WriteLine("32bit OS?")
+
    End If
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
なお、ハンドルを扱う場合は、可能なら&msdn(netfx,type,System.Runtime.InteropServices.SafeHandle){SafeHandle};等を使うことが推奨されます。
+

          
+
**型のサイズの取得
+
型のサイズ(バイト数)を取得したい場合は、&msdn(netfx,member,System.Runtime.InteropServices.Marshal.SizeOf){Marshal.SizeOfメソッド};を使うことが出来ます。 引数に値やオブジェクトを直接指定するか、typeof/GetTypeで取得した型情報を渡すことにより、その型のサイズを取得することが出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Runtime.InteropServices;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    Console.WriteLine("SizeOf({0}) = {1}", 16, Marshal.SizeOf(16));
+
    Console.WriteLine("SizeOf({0}) = {1}", 3L, Marshal.SizeOf(3L));
+
    Console.WriteLine("SizeOf({0}) = {1}", 3.14, Marshal.SizeOf(3.14));
+
    Console.WriteLine("SizeOf({0}) = {1}", 1.414f, Marshal.SizeOf(1.414f));
+
    Console.WriteLine();
+

          
+
    Console.WriteLine("SizeOf({0}) = {1}", typeof(int), Marshal.SizeOf(typeof(int)));
+
    Console.WriteLine("SizeOf({0}) = {1}", typeof(long), Marshal.SizeOf(typeof(long)));
+
    Console.WriteLine("SizeOf({0}) = {1}", typeof(float), Marshal.SizeOf(typeof(float)));
+
    Console.WriteLine("SizeOf({0}) = {1}", typeof(double), Marshal.SizeOf(typeof(double)));
+
    Console.WriteLine("SizeOf({0}) = {1}", typeof(IntPtr), Marshal.SizeOf(typeof(IntPtr)));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Runtime.InteropServices
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("SizeOf({0}) = {1}", 16, Marshal.SizeOf(16))
+
    Console.WriteLine("SizeOf({0}) = {1}", 3L, Marshal.SizeOf(3L))
+
    Console.WriteLine("SizeOf({0}) = {1}", 3.14, Marshal.SizeOf(3.14))
+
    Console.WriteLine("SizeOf({0}) = {1}", 1.414F, Marshal.SizeOf(1.414F))
+
    Console.WriteLine()
+

          
+
    Console.WriteLine("SizeOf({0}) = {1}", GetType(Integer), Marshal.SizeOf(GetType(Integer)))
+
    Console.WriteLine("SizeOf({0}) = {1}", GetType(Long), Marshal.SizeOf(GetType(Long)))
+
    Console.WriteLine("SizeOf({0}) = {1}", GetType(Single), Marshal.SizeOf(GetType(Single)))
+
    Console.WriteLine("SizeOf({0}) = {1}", GetType(Double), Marshal.SizeOf(GetType(Double)))
+
    Console.WriteLine("SizeOf({0}) = {1}", GetType(IntPtr), Marshal.SizeOf(GetType(IntPtr)))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
SizeOf(16) = 4
+
SizeOf(3) = 8
+
SizeOf(3.14) = 8
+
SizeOf(1.414) = 4
+

          
+
SizeOf(System.Int32) = 4
+
SizeOf(System.Int64) = 8
+
SizeOf(System.Single) = 4
+
SizeOf(System.Double) = 8
+
SizeOf(System.IntPtr) = 4
+
}}
+
#tabpage-end
+

          
+
ただし、どのような型のサイズでも取得出来るわけではなく、アンマネージコードに渡す場合のサイズが定義できない型ではサイズを取得できず、その場合はArgumentExceptionがスローされます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Runtime.InteropServices;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    Console.WriteLine("SizeOf({0}) = {1}", typeof(string), Marshal.SizeOf(typeof(string)));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Runtime.InteropServices
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("SizeOf({0}) = {1}", GetType(String), Marshal.SizeOf(GetType(String)))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
ハンドルされていない例外: System.ArgumentException: 型 'System.String' はアンマネージ構造体としてマーシャリングできません。有効なサイズ、またはオフセットの計算ができません。
+
   場所 System.Runtime.InteropServices.Marshal.SizeOfHelper(Type t, Boolean throwIfNotMarshalable)
+
   場所 System.Runtime.InteropServices.Marshal.SizeOf(Type t)
+
   場所 Sample.Main()
+
}}
+
#tabpage-end
 

        

        
+
なお、独自に定義した構造体の場合は、StructLayout属性でLayoutKind.SequentialまたはLayoutKind.Explicitを指定する必要があります。 詳しくは[[programming/netfx/structlayout_fieldoffset]]を参照してください。
 

        

        
 
*定数
*定数
 
基本データ型には、最大値・最小値などの定数を表す静的フィールドが用意されています。
基本データ型には、最大値・最小値などの定数を表す静的フィールドが用意されています。