システム開発・Webサイト構築 プラスラス

2009/2/21 土曜日

【.NET】C#プログラマのためのVB.NETの注意点

このエントリーを含むはてなブックマーク Yahoo!ブックマークに登録 Google ブックマーク del.icio.us

.NET Frameworkを使用する以上、C#とVB.NETには、あまり差がないため、C#プログラマが、VBでの開発を行うこともあると思います。

しかしながら、VBには特有のクセがあるため、VBの基本的な構文だけを覚えただけで、開発にあたると思わぬ落とし穴にはまりかねません。

そこで、C#プログラマがVB.NETを使用した開発を行う場合にあらかじめ知っておいた方が良い点をまとめます。

変数の初期化

C#の場合は、メソッドのローカル変数の場合に初期化は必須ですが、VB.NETの場合は、数値の型は 0 オブジェクトの場合は、Nothing で初期化されます。

ただし、ループ内に変数の宣言がある場合であっても、暗黙的な初期化は最初に実行される場合にのみ行われます。

For i As Integer = 0 To 2
    Dim a As Integer
    a += 1
    Console.WriteLine("a:" & a)

    Dim b As Integer = 0
    b += 1
    Console.WriteLine("b:" & b)
Next
'出力結果
'a:1
'b:1
'a:2
'b:1
'a:3
'b:1

上記のコードの場合、a は、最初のループのみ 0 に初期化されます。
b は初期化を明示的に書いてあるため、ループで宣言行に戻るたびに 0 になります。

わかりにくいコードになるので、敢えてこのような使い分けはしない方が良いでしょう。また、思わぬ動作になりかねないのでいつも明示的に初期化を書くようにした方が良いと思います。

小数から整数への切捨てキャスト

Cint()を使用すると、C#の「(int)値」のような書き方と違い、引数の小数部分が 0.5 の場合は、偶数に近い値に丸められます。

Dim d1 As Double = 1.1
Dim d2 As Double = 1.5
Dim d3 As Double = 2.5
Dim d4 As Double = 3.5

Console.WriteLine(CInt(d1))
Console.WriteLine(CInt(d2))
Console.WriteLine(CInt(d3))
Console.WriteLine(CInt(d4))

'出力結果 
'1
'2
'2
'4

小数部分を切り捨てて、整数に代入したい場合は、Fix()、Int()などで先に切り捨てます。

Dim d As Double = 1.5

Console.WriteLine(CInt(Int(d)))

'出力結果
'1

なお、Fix()とInt()は、引数が負の値の場合に、結果が異なります。
Int()が 引数以下の最大の負の整数を返すのに対して、Fix()は引数以上の最小の負の整数を返します。

配列

配列の宣言時に大きさを指定する場合、VBの場合は最大のインデックスを指定します。C#のように要素数ではありません。

Dim arr(3) As Integer 'インデックスが0~3の4個の配列になる

'ちなみに
'Dim arr AS Integer(3)    とは書けません

2005以降では、開始から終了までを0 To 3と表すような書き方もできます。

Dim arr(0 To 3) As Integer    'インデックスが0~3の4個の配列になる

先頭のインデクッスは0しか指定できませんが、見た目がわかりやすいと思います。

また、C#の配列のように変数の宣言と実体の確保を別に書くこともできます。

Dim arr As Integer()    '宣言  これは Dim arr() As Integer とも書ける
arr = New Integer(3){}    '実体の確保

'1行で
'Dim arr As Integer() = New Integer(3){}
'とも書けます。

中カッコは配列の宣言と要素の初期化を同時にやる方法に使いますが、上記のように実体を確保する場合にも必要です。(ないとコンストラクタと曖昧になってしまうので)

説明の順序が逆になりましたが、配列の要素を初期化するには、

Dim arr As Integer() = {5, 10, 0}

'Dim arr As Integer() = New Integer() {5, 10, 0} でも良い

のようにします。

ちなみに、大きさ0の配列を代入するには以下のようにします。

'一番シンプル?
Dim arr(-1) As Integer

'あるいは、
'Dim arr As Integer()        '宣言だけだとNothingです。
'arr = New Integer(-1){}    'これで大きさ0の配列になります。
'と書きます

'さらに
'Dim arr As Integer()
'arr = New Integer(){}
'と書くこともできます。

'1行で書くなら
'Dim arr AS Integer() = {}
'でも良いです。

論理演算子

VBの論理演算子のANDやORは、C#の && や || と違い、ショートサーキット評価ではありません。 VB.NETでショートサーキット評価を行いたい場合は、&& は、AndAlso || は OrElse を使います。

Dim s As String = Nothing

'以下の式は必ず両方が評価されるのでNullReferenceException例外が発生します

If Not s Is Nothing And s.Length > 0 Then    

    MsgBox(s)

End If

AndAlsoを使えば前の式だけの評価で判定が決まり、例外が発生しません。

 

関連図書

関連記事

Filed under: Programming,VB.NET — Nakai @ 2:08:42

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.855 sec. Powered by WordPress