■29604 / inTopicNo.4) |
Re[3]: VbScriptからCOM+(C#)へのオブジェクト渡し |
□投稿者/ 魔界の仮面弁士 (945回)-(2008/12/11(Thu) 13:17:22)
|
■No29592 (iSyouta さん) に返信
>>'Call objCom.mtdReturn(objComDataBean)
>>Call objCom.mtdReturn((objComDataBean))
> 2重括弧で値渡しとなるんですね。勉強不足でした。。。。
# 2 重括弧と表現してしまうと語弊があるかも。
括弧を付けるのは、「変数」を「式」に変えるためです。
たとえば、整数を参照渡しするメソッドがあったとして、
Foo.ByRefMethod(a)
によって、変数 a の中身が書き換わる事はあっても、
Foo.ByRefMethod(a + 1)
や
Foo.ByRefMethod(123)
と指定した場合は、メソッド側で引数を書き換えたとしても、
数式 a + 1 や、リテラル 123 まで書き換わるわけではありません。
動作的には、値渡しというよりは C# 的でいうところの
Foo.Method(ref x);
というコードを、
work = (x);
Foo.Method(ref work);
// x = work; //書き戻さない…
に修正した状態に近い状態になります。
おまけ。
http://support.microsoft.com/kb/197956/ja
http://support.microsoft.com/kb/243548/ja
>>> Response.Write(objcomDataBean.intNum3)
>>それと上記の記述だと、
> Call Response.Write((objcomDataBean.intNum3))
>>という意味になってしまいます。この場合は.....
> 処理の意味が変わってしまうという事でしょうか??
元コードにあった括弧は、メソッド呼び出しの括弧を意味しているわけではありません。
非.NET な Visual Basic 系言語においては、
『メソッドの呼び出しに括弧は使わない。括弧を付けたいなら Call を併用。』
という仕様になっています。
特に、複数の引数を持つメソッドの呼び出しにおいては、
Foo.Method("aaa", "bbb", "ccc")
という記述にすると、そもそも文法違反となりますので、
Foo.Method "aaa", "bbb", "ccc"
もしくは
Call Foo.Method("aaa", "bbb", "ccc")
と記述する事が求められます。
今回は引数の数が 1 個だけだったので、それが「式」としての括弧として
扱われるため、文法的には 一応 通ってしまっていたというだけです。
ちなみに引数 0 個の場合は、というと、
Call Foo '…VB6 = ○, VBS = ○ 'これでも一応OK
Call Foo() '…VB6 = ◎, VBS = ◎ 'これが正しい
Foo '…VB6 = ◎, VBS = ◎ 'これが正しい
Foo() '…VB6 = ×, VBS = ○
のように、VB6 と VBS とで文法判定が微妙に異なっていたりします。
|
|