Re: IS演算子の必要性 ( No.1 ) |
- 日時: 2007/06/20 10:40
- 名前: 魔界の仮面弁士
- > ・オブジェクト変数へのオブジェクト代入は、VB6ではSet文で行った。VB2005ではSetは不要(すなわちLet)
どちらかというと、(Letではなく)Set の動作ですね、VB2005では。 値型に付いては、ボックス化(boxing)とその解除(unboxing)が行われます。
ただし COM 相互運用時においては、やはり Let と Set とを別に扱う必要があります。 # だからこそ CallByName では、両者を区別して呼び出せるようになっています。
また Let / Set の使い分けは、呼び出し側ではなく、それを受け取る側の実装に依存しています。 COM クラス側の実装如何では、「オブジェクトを Let で渡す」こともできますし、 実際、そのような仕様になっている COM クラスも少なからず存在しています。
例をあげてみると、ADODB.Command オブジェクトの "Output Stream" 動的プロパティが、 Stream オブジェクトを Let で渡す仕様になっていましたし、より身近なところでは、 VB6 PictureBox オブジェクトの Picture プロパティは、Picture オブジェクトを Let でも Set でも渡せる仕様になっています。
> ・それなのに変数比較だけはVB6同様、ISと=を使い分けている。 すべてがオブジェクトである、とは言っても、だからといって 「参照」と「値」の概念まで無くなったわけではないですよね。 VB6 でいうところの IsObject(x) 、.NET でいうところの IsReference(x) の違いです。
そもそも Is 演算子の意味は、VB6 の頃から変化していないと思います。 すなわち、「オブジェクト参照の一致性を見るための演算子」です。 .NET では参照型にしか使えず、VB6 においてはオブジェクトにしか使えません。
= 演算子についても、(VBS / VB6 / .NET でそれぞれ微妙に意味が異なるとはいえ) 基本的には「値の一致性を見るための物」である点は変化していないと思います。 (ちなみに、VB.NET の = 比較演算子と、C# の == 比較演算子は別物です)
両者に求められる機能が異なっている以上、一方を廃止する事も出来ないのではないでしょうか。
> いやちゃんとIS演算子と=比較演算子は分ける必然性があるというなら、宜しくお聞かせ下さい。 逆に質問しますが、Is 演算子があると困る場合というのはありますでしょうか? あるいは、「Is 比較では False だが、= 比較では True となる場合」において、 ダンボさんであれば、どのような言語実装がなされれば、違和感を感じなくなりますか?
|
|