バリアントは、特定のプログラミング言語、特にVisual Basic、OCaml、[1] Delphi、C++でコンポーネントオブジェクトモデルを使用する場合のデータ型です。これは、コンピューターサイエンスにおける同名の概念の実装です。
Visual Basic (およびVisual Basic for Applications ) では、バリアント データ型は、固定長文字列型を除く他の任意のデータ型 (整数、浮動小数点、単精度および倍精度、オブジェクトなど)を表すために使用できるタグ付き共用体です。Visual Basic では、明示的に宣言されていない変数、またはその型が明示的に宣言されていない変数は、バリアントとして扱われます。
明示的に宣言されていないバリアントの使用は推奨されませんが、必要なデータ型が実行時にのみわかる場合、データ型が変化すると予想される場合、またはオプションのパラメータとパラメータ配列が必要な場合には、バリアントが役立ちます。実際、動的型システムを備えた言語では、変数に使用できる型 としてバリアントのみを持つことがよくあります。
Visual Basic .NETは.NET 言語であるため、主な変更点の 1 つとして、バリアント型が .NETオブジェクト型に置き換えられました。概念的には類似点がありますが、大きな違いもあり、これら 2 つの型の間には直接的な変換は存在しません。Visual Basic .NET コードが Visual Basic 6 COM オブジェクトと対話する場合に必要になる可能性がある変換については、通常の方法では.NET マーシャリングを使用します。
例
Visual Basic では、A という名前のバリアントを明示的または暗黙的に宣言できます。
Dim A Dim Aのバリエーション
Delphiでは、 A という名前のバリアントは次のように宣言されます。
var A :バリアント;
形式
Visual Basic で定義されているバリアント型の変数 (簡潔に「バリアント」と呼ばれます) には 16 バイトのストレージが必要で、そのレイアウトは次のようになります。
種類
Visual Basic で遭遇する可能性のあるバリアントの例をいくつか次に示します。他の言語では、他の種類のバリアントも使用できます。
- 1初期化されていないバリアントの型。
- 2データベース内の NULL 値の型。つまり、初期化されておらず、C++ のnull ポインターと同等でもありません。
- 3不足している引数は、実際には「パラメータが見つかりません」という特定のエラー値です。
- 4オブジェクト タイプが null 参照に設定されました。
- 5 TypeName は、含まれているオブジェクトのクラス名を返します。データはインターフェイスポインター、つまり仮想メソッド テーブル(関数ポインターの配列)へのポインターへのポインターになります。
一般的な用途
コレクション
OLE オートメーションCollectionのクラスは、さまざまなデータ型の項目を格納できます。これらの項目のデータ型はコンパイル時にわからないため、コレクションに項目を追加したり、コレクションから項目を取得したりするメソッドではバリアントを使用します。Visual Basic でこの構造を使用する場合、反復子変数はオブジェクト型またはバリアントである必要があります。
For Each
ディスパッチメソッド呼び出し
OLE オートメーションでは、IDispatchオブジェクトのクラスが事前にわからない場合にインターフェイスが使用されます。したがって、そのようなオブジェクトのメソッドを呼び出す場合、引数の型と戻り値はコンパイル時にわかりません。引数はバリアントの配列として渡され、呼び出しが完了するとバリアントが返されます。
オプションパラメータ
Visual Basic では、プロシージャ引数は、キーワードをプレフィックスとして付けることによってオプションとして宣言できます。引数が省略されると、Visual Basic は、上の表でMissingOptionalと呼ばれる、引数が欠落していることを示す特殊な値をプロシージャに渡します。値は指定された値または特殊な値のいずれかになる可能性があるため、バリアントを使用する必要があります。
関数GetText (省略可能ByVal Index ) As String If IsMissing ( Index ) Then GetText = Item ( CurrentItem ) Else GetText = Item ( Index ) End If End Function
同様に、キーワードをParamArray使用して、後続のすべての引数をバリアント配列で渡すこともできます。
参照
参考文献
- ^ 「第6章 バリアント / Real World OCaml」v1.realworldocaml.org。2019年5月8日時点のオリジナルよりアーカイブ。
外部リンク
- C++ ブースト.バリアント
- https://msdn.microsoft.com/en-ca/library/cc237865.aspx
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx
