- PR -

VBとC#の3項演算子について

1
投稿者投稿内容
TAKA
会議室デビュー日: 2007/06/03
投稿数: 19
投稿日時: 2008-11-11 21:04
お世話になります。

VB.NET2008にて、文字列のnull判定を、3項演算子(のように)判定したく、
以下のコーディングを行いました。

---------------- VB -------------------
Dim s As String = Nothing
Dim i As Integer = IIf(s Is Nothing, 0, s.Length)
---------------------------------------

この時、「s Is Nothing」はtrueなので、「s.length」は評価されずに
「0」が返却される事を期待しているのですが、NullReferenceExceptionが
発生してしまいます。

ちなみに、C#では、以下のコーディングで例外は発生しません。(期待通り)
また、javaもC#と同様です。
---------------- C# -------------------
String s = null;
int i = (s == null) ? 0 : s.Length;
---------------------------------------

VB,NETのIIf関数は、常に第2・第3引数の式を評価してしまうのでしょうか?
VB.NETで、上記C#の3項演算子と同様のコーディングは可能でしょうか?

よろしくお願い致します。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-11-11 21:15
私もつい3日前に知ったんですが、
If 演算子
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2008-11-11 21:16
VB は門外漢ですが…IIF はショートサーキットはしなかったと思います。それでも大して問題はなかっただろうですし。

で。まぁやっぱり 2008 で式ツリーが出来たときにたぶん問題になったんだと思います。IF という新しい演算子が追加されています。IF(条件, 評価1, 評価2) みたいにやってみてください。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2008-11-11 21:17
IIf 関数は関数ですので、当然ながら引数は全て評価されます。

VB2008 に対応する VB9 から、If ステートメントで条件演算が可能になっています。
コード:

Dim s As String = Nothing
Dim i As Integer = If (s Is Nothing, 0, s.Length)



<追記>
かぶった上に、ステートメントじゃなくて演算子っすね。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2008-11-11 21:19 ]
TAKA
会議室デビュー日: 2007/06/03
投稿数: 19
投稿日時: 2008-11-11 21:52
rain様、ya様、Hongliang様、ありがとうございます。
解決致しました!ちょっとビックリしましたが・・。

1

スキルアップ/キャリアアップ(JOB@IT)