.NET オブジェクトへのデータの受け渡し
MATLAB® から .NET メソッドまたは関数を呼び出すと、MATLAB は引数を .NET 型に変換します。MATLAB は、既に .NET オブジェクトである引数を除いて、渡される引数ごとにこの変換を実行します。以下のトピックでは、特定のデータ型を .NET メソッドに渡す方法について説明します。
MATLAB が .NET 型を MATLAB 型にマッピングする方法については、.NET オブジェクトから返されるデータの処理を参照してください。
プリミティブ .NET 型の受け渡し
以下の表は、渡される引数の MATLAB の基本データ型と、入力引数に対して定義されている対応する .NET 型を示します。各行は MATLAB 型、続いて一致する可能性のある .NET 引数を、一致度の高い順に左から右に示します。
MATLAB プリミティブ型の変換表
| MATLAB 型 | 最も一致度の高い型 <————— 他の一致する .NET 型 —————> 最も一致度の低い型 各 .NET 型は前に System. が付く | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| logical | Boolean | Byte | SByte | Int16 | UInt16 | Int32 | UInt32 | Int64 | UInt64 | single | double | オブジェクト |
| double | double | single | Decimal | Int64 | UInt64 | Int32 | UInt32 | Int16 | UInt16 | SByte | Byte | オブジェクト |
| single | single | double | Decimal | オブジェクト | ||||||||
| int8 | SByte | Int16 | Int32 | Int64 | single | double | オブジェクト | |||||
| uint8 | Byte | UInt16 | UInt32 | UInt64 | single | double | オブジェクト | |||||
| int16 | Int16 | Int32 | Int64 | single | double | オブジェクト | ||||||
| uint16 | UInt16 | UInt32 | UInt64 | single | double | オブジェクト | ||||||
| int32 | Int32 | Int64 | single | double | オブジェクト | |||||||
| uint32 | UInt32 | UInt64 | single | double | オブジェクト | |||||||
| int64 | Int64 | double | オブジェクト | |||||||||
| uint64 | UInt64 | double | オブジェクト | |||||||||
| char | char | string | オブジェクト | |||||||||
| string | string | オブジェクト | ||||||||||
以下のプリミティブ .NET 引数型には、直接的に等価な MATLAB の型はありません。MATLAB はこれらの型をそのまま渡します。
System.IntPtrSystem.UIntPtrSystem.Decimal列挙型
cell 配列の受け渡し
以下の表のように、System.Object または System.String 引数の配列が想定されている .NET プロパティまたはメソッドに cell 配列を渡すことができます。
MATLAB cell 配列の変換表
| MATLAB 型 | 最も一致度の高い型 <——— 他の一致する .NET 型 ———> 最も一致度の低い型 | ||
|---|---|---|---|
string スカラーまたは文字配列の cell 配列 | System.String[] | System.Object[] | System.Object |
cell 配列 (string 配列または文字配列ではない) | System.Object[] | System.Object | |
セルの要素は、サポートされている以下の型のいずれかになります。
MATLAB プリミティブ型の変換表に示されている非スパースで非複素数の組み込み数値型
stringcharlogicalcell 配列
.NET オブジェクト
非プリミティブ .NET オブジェクトの受け渡し
特定の .NET クラスの引数をもつメソッドを呼び出す場合は、そのクラスまたはその派生クラスのインスタンスであるオブジェクトを渡します。このようなオブジェクトは、クラス コンストラクターを使用して作成することも、そのクラスのメンバーによって返されるオブジェクトを使用することもできます。クラスのメンバーが .NET オブジェクトを返した場合、MATLAB はこれを .NET オブジェクトのままにしておきます。このオブジェクトを使用して、クラスの他のメンバーとやり取りを行います。
MATLAB string および文字データを渡す
MATLAB は次のように自動変換します。
char配列から .NETSystem.Stringオブジェクト。複数のchar配列から成る配列を渡すには、cell 配列を作成します。stringスカラーから .NETSystem.Stringオブジェクト。string配列の各stringスカラーから .NETSystem.Stringオブジェクト。string配列はSystem.String[]に変換されます。string 値
<missing>から null。string.emptyからサイズ 0 のSystem.String[]。
MATLAB ディクショナリ データの引き渡し
暗黙的な変換
MATLAB ディクショナリを .NET メソッドに渡すことができます。たとえば、ディクショナリ入力引数を受け取る .NET メソッド MyClass.SomeMethod があるものとします。
mlDict = dictionary("a",1,"b",2); MyClass.SomeMethod(mlDict);
MATLAB では、以下の型への暗黙的な変換をサポートしています。
System.Collections.Dictionary<,>System.Collections.IDictionary<,>System.Collections.IReadOnlyDictionary<,>System.Collections.IDictionary
ジェネリック型 (<,> が含まれる) では、キーおよび値が変換先の型に一致している必要があります。たとえば、メソッドが Dictionary<int,int> を受け入れる場合、int32 キーを int32 値にマッピングする MATLAB ディクショナリを渡す必要があります。MATLAB はキーや値を変換しません。
cell 型のエントリをもつ MATLAB ディクショナリは、System.Object 型のエントリをもつ .NET ディクショナリにのみ変換できます。
明示的な変換
関数 NET.createDictionary を呼び出すことで、MATLAB ディクショナリからジェネリックの .NET ディクショナリを明示的に作成できます。
netDict = NET.createDictionary(mlDict); MyClass.SomeMethod(netDict);
System.Nullable 型の受け渡し
以下の任意の項目を System.Nullable<ValueType> の入力引数で .NET メソッドに渡すことができます。
基となる
<ValueType>の変数null値、[]System.Nullable<ValueType>オブジェクト
ValueType 型の MATLAB 変数を渡す場合には、MATLAB ではシグネチャを読み取り、変数を System.Nullable<ValueType> オブジェクトに自動的に変換します。System.Nullable<ValueType> に受け入れられる使用可能な ValueType 値の一覧については、MATLAB プリミティブ型の変換表を参照してください。
たとえば、System.Nullable 引数の受け渡しを参照してください。
NULL 値の受け渡し
MATLAB は、参照型の引数に空の double ([]) 値を使用します。
サポートされていない MATLAB 型
MATLAB では、次の MATLAB 型の .NET メソッドへの受け渡しをサポートしていません。
構造体配列
スパース配列
複素数
メソッド シグネチャの選択
MATLAB は以下の基準に基づいて、適切な .NET メソッド シグネチャ (コンストラクター、静的および非静的メソッドを含む) を選択します。
MATLAB 関数が .NET メソッドを呼び出すと、MATLAB では以下が実行されます。
オブジェクト (静的メソッドの場合はクラス) がその名前のメソッドをもつことを確認します。
呼び出しによって、その名前をもつ少なくとも 1 つのメソッドと同じ数の引数が渡されるかどうかを決定します。
渡されたそれぞれの引数が、メソッドに対して定義された型に変換できるかどうかを確認します。
前の条件がすべて満たされると、MATLAB はメソッドを呼び出します。
オーバーロード メソッドの呼び出しでは、候補が複数ある場合、MATLAB はMATLAB プリミティブ型の変換表に基づいて、呼び出し引数に最も適合する引数をもつメソッドを選択します。最初に MATLAB は、渡される引数と互換性のない引数の型をもつメソッドをすべて排除します。MATLAB は、残りのメソッドの中で最高の適合度値 (すべての引数の適合度値の合計) をもつメソッドを選択します。各引数の適合度値は、MATLAB 型が .NET 型にどの程度近いかを示します。2 つのメソッドが同じ適合度である場合、MATLAB はクラスで最初に定義された方を選択します。
クラス タイプの場合、MATLAB は、想定される .NET クラス タイプまでの受信クラス タイプからの距離に基づいて、メソッド シグネチャを選択します。受信タイプが想定されるタイプに近いほどよりよく一致します。
オプションの引数をもつオーバーロード メソッドの規則については、呼び出すオーバーロード メソッドの決定を参照してください。
例 — メソッド シグネチャの選択
System.String クラスの methodsview ウィンドウを開き、Concat メソッドのエントリを調べます。
import System.* methodsview('System.String')
Concat メソッドは 1 つ以上の引数を取ります。引数が System.String 型の場合、メソッドは値を連結します。たとえば、2 つの文字列を作成します。
str1 = String('hello'); str2 = String('world');
次を入力します。
String.Concat(str1,str2)
MATLAB は、Concat メソッドが存在することを検証し、2 つの入力引数をもつシグネチャを探します。以下の表は、2 つのシグネチャを示しています。
| 名前 | 戻り値の型 | 引数 | 修飾子 |
|---|---|---|---|
Concat | System.String RetVal | (System.Object arg0, | Static |
Concat | System.String RetVal | (System.String str0, | Static |
str1 と str2 は System.String クラスなので、MATLAB は 2 番目のシグネチャを選択し、以下のように表示します。
ans = helloworld
引数が System.Object 型の場合、メソッドは値の文字列表現を表示します。たとえば、2 つの System.DateTime オブジェクトを作成します。
dt = DateTime.Today; myDate = System.DateTime(dt.Year,3,1,11,32,5);
次を入力します。
String.Concat(dt,myDate)
MATLAB は、System.DateTime オブジェクトが System.Object クラスから派生しているため、次のシグネチャを選択します。
| 修飾子 | 戻り値の型 | 名前 | 引数 |
|---|---|---|---|
Static | System.String RetVal | Concat | (System.Object arg0, |
この Concat メソッドはまず ToString メソッドをオブジェクトに適用し、次に文字列を連結します。MATLAB には情報が次のように表示されます。
ans = 12/23/2008 12:00:00 AM3/1/2008 11:32:05 AM
配列の受け渡し
MATLAB の配列を .NET メソッドに渡す方法の詳細は、.NET アプリケーションによる配列の使用およびジャグ配列としての MATLAB 配列の受け渡しを参照してください。
変換に対する配列次元の影響
.NET 配列の次元は、配列の要素へのアクセスに必要な添字の数です。次元の数を取得するには、.NET System.Array 型の Rank プロパティを使用します。MATLAB 配列の次元数は、配列内の大きさが 1 でない次元の数です。
MATLAB は、MATLAB 配列の次元数が想定される次元数以下である限り、配列の次元数を .NET メソッド シグネチャに一致させます。たとえば、スカラー入力を、2 次元配列を想定するメソッドに渡すことができます。
次元数が N である MATLAB 配列において、.NET 配列の次元数が N より少ない場合、MATLAB 変換において大きさが 1 の次元が、最初のものから残りの次元数が .NET 配列の次元数と一致するまで削除されます。
MATLAB 配列の System.Object への変換
System.Object を想定するメソッドに MATLAB 配列を渡すことができます。
ジャグ配列としての MATLAB 配列の受け渡し
MATLAB 配列は方形配列です。.NET は、複数の配列からなる配列である "ジャグ配列" をサポートします。ジャグ配列では、要素の次元やサイズが一様にならない可能性があります。
.NET 言語ではジャグ配列をサポートしますが、jagged は言語キーワードではありません。C# の関数シグネチャは、複数の大かっこ対 ([][]) を使用してジャグ配列を表します。さらに、ジャグ配列は入れ子 ([][][])、多次元 ([,])、多次元要素での入れ子 ([,,][,][]) にすることができます。
MATLAB は、数値型の MATLAB 配列を対応するジャグ配列型に自動的に変換します。入力引数が非数値型または多次元の場合は、関数 NET.createArray を使用して配列を作成し、ジャグ配列として渡すことができます。NET.createArray の使用例は、ジャグ配列の受け渡しを参照してください。