VB.NETでAPIを使用しようとしたところ、
エラーが発生したのでHELPを見ました。
”構造体のインスタンスを初期化するには Initialize を呼び出す必要がある”
というタイトルでいろいろ説明が書いてあったのです。...が、
頭の悪い私には内容が理解ができません。どなたか頭の悪い私分かる様に
説明内容を説明していただけないでしょうか?お願いします。
> VB.NETでAPIを使用しようとしたところ、
どんなコードを書いたのでしょうか?
それがわからない事には、コードの修正案が出せないのですが…。(^^;)
> ”構造体のインスタンスを初期化するには Initialize を呼び出す必要がある”
> というタイトルでいろいろ説明が書いてあったのです。...が、
例えば、構造体のメンバで、配列を使う場合を考えてみてください。
VB.NETの構造体は、
Public Structure Test
Dim aaa(2) As Short
End Structure
のように、初期サイズを与えて宣言する事はできませんし、
Public Structure Test
Dim aaa() As Short = New Short() {1, 2, 3}
End Structure
のように、初期値を与えて宣言する事もできません。
そのため、どうしても、
Public Structure Test
Dim aaa() As Short
End Structure
のような宣言にせざるを得ないのです。
しかしAPIに引き渡す場合には、配列サイズが
未定のままというわけにはいきません。
そのため、あらかじめ呼び出し前に、
Dim udtTest As Test
ReDim udtTest.aaa(10)
などとして、配列を初期化しておく必要があります。
(初期化後であれば、APIに渡すことができます)
———しかし、いちいち、構造体を使用する前に
各メンバを初期化するようなコードを書くのは面倒ですし、
メンバ数が多くなってくると、間違いの元になってしまいます。
そこで、構造体自身に初期化用のメソッドを追加しておくようにします。
Public Structure Test
Dim aaa() As Short
Public Sub Initialize()
ReDim aaa(10)
End Sub
End Structure
そして、呼び出し側では、
Dim udtTest As Test
udtTest.Initialize()
のようにして、初期化用メソッドを実行してから利用します。
こうすれば、正しく初期化を行う事ができるわけです。
(Initializeを呼び出すことを忘れない限りは…)
実際には、初期化用のメソッドの名前はInitializeでなくても
良いのですが、VB6からアップグレードしたコードでは、
このInitializeという名前が利用されるので、
それに習って、Sub Initialize() とする事が多いようです。
魔界の仮面弁士さん、とてもわかりやすい説明をありがとうございます。
何度もHELPの説明を読み返したのですが、意味が理解できず、困っていました。
本当にありがとうございました。
ツイート | ![]() |