C#から見たVB.NET

仕事でVB.NETを使う必要が出てきそうなので最近のVBがどうなっているのかチェックがてらメモしておく。

VBは7(.NET 1.0)までしか使っていないので、その後ジェネリックとかがどのように取り込まれたか全く知らないのでそのへんも気になる。

基本的な相違点

  • C#はクラス名やメソッド名などの識別子を大文字小文字で区別するが、VBは区別しない。
  • VBは事前バインディングと遅延バインディングを切り替えられる(Option Strict On/Off)。
  • VBは変数の型宣言を強制するかどうかを切り替えられる(Option Explicit On/Off)。

リテラル

ちょこちょこ違う

C#
string s = "Hello";
char ch = 'a';
int i = 1;
long l = 1L;
double d = 1.0;
float f = 1.0F;
bool bl = true;
object o = null;
VB.NET
Dim s As String = "Hello"
Dim ch As Char = "a"c
Dim i As Integer = 1
Dim l As Long = 1L
Dim d As Double = 1.0
Dim f As Single = 1.0F
Dim bl As Boolean = True
Dim o As Object = Nothing

日付リテラル

Dim d1 = #10/12/2008#
Dim d2 = #10/12/2008 10:00:00 AM#

他にもあるけど割愛する。

配列

配列の生成とアクセス

C#
int[] array = new int[] { 1, 2, 3, 4, 5 };
// 省略
int[] array = { 1, 2, 3, 4, 5 };
// 型推論
var array = new int[] { 1, 2, 3, 4, 5 };

Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
VB.NET
Dim array() As Integer = new Integer() {1, 2, 3, 4, 5}
' 省略
Dim array() As Integer() = {1, 2, 3, 4, 5}
' 型推論
Dim array() = New Integer() {1, 2, 3, 4, 5}

Console.WriteLine(array(0));
Console.WriteLine(array(1));

演算子

違うのはこれくらいで後は一緒

種類 C# VB.NET
等号 == =
不等号 != <>

ステートメント

条件分岐とか繰り返し文

C#
int val = GetValue();
// 条件分岐
if(val == 0) {
    // trueの場合
} else {
    // falseの場合
}

// 繰り返し文
for(int i=0; i<10; i++) {
    // 処理
}

int[] intArray = GetArray();
// 繰り返し文(コレクション)
foreach(int i in intArray) {
    // 処理
}
VB.NET
Dim val As Integer = GetValue()
' 条件分岐
If val = 0 Then
    ' Trueの場合
Else
    ' Falseの場合
End If

' 繰り返し文
For i As Integer = 0 to 10
    ' 処理
End For

Dim intArray As Integer(,) = GetArray()
' 繰り返し文(コレクション)
For Each i As Integer in intArray
    ' 処理
Next

アクセス修飾子

クラスやメソッドのアクセス範囲を宣言する修飾子

C# VB.NET アクセス範囲
public Public 全て
private Private クラス内のみ
protected Protected クラス内と継承したクラスのみ
internal Friend アセンブリ
protected internal Protected Friend クラス内と継承したクラス、アセンブリ

名前空間

名前空間

C#
namespace HogeSpace {
    // 定義
}

// インポート
using HogeSpace;
// エイリアス
using HS = HogeSpace;
VB.NET
Namespace HogeSpace
    ' 定義
End Namespace

' インポート
Imports HogeSpace
' エイリアス
Imports HS = HogeSpace

XML名前空間のインポート

Imports <xmlns:hoge="http://hoge.com">

クラス

クラス(VBの場合、モジュールもクラスに含まれる)

C#
class Hoge {
}

// 静的クラス
static class StaticHoge {
}

// 抽象基本クラス
abstract class AbstractHoge {
}

// 継承
class ExtendHoge : Hoge {
}

// 継承不可
sealed class SealedHoge {
}
VB.NET
Class Hoge
End Class

' 静的クラス(モジュール)
Module StaticHoge
End Module

' 基本クラス
MustInherit Class AbstractHoge
End Class

' 継承
Class ExtendHoge
    Inherits Hoge
End Class

' 継承不可
NotInheritable Class SealedHoge
End Class

インターフェース

インターフェース

C#
interface IHoge {
}

// 実装
class Hoge : IHoge {
}
VB.NET
Interface IHoge
End Interface

' 実装
Class Hoge
    Implements IHoge
End Class

構造体

構造体

C#
struct HOGE {
    public string Name;
}
VB.NET
Structure HOGE
    Public Name As String
End Structure

メソッド

メソッド(プロシージャ、ファンクション)

C#
public void DoSomething() {
}

// 引数あり
public void PrintMessage(string message) {
}
// 引数二つ、オーバーロード
public void PrintMessage(string message, int count) {
}

// 戻り値あり
public string GetMessage() {
}

// オーバーライド可能
public virtual void OverridableMethod() {
}

// オーバーライド
public override void OverridableMethod() {
}

// 再定義
public new public void ReDeclareMethod() {
}
VB.NET
Public Sub DoSomething()
End Sub

' 引数あり
Public Sub PrintMessage(ByVal message As String)
End Sub
' 引数二つ、オーバーロード
Public Sub PrintMessage(ByVal message As String, ByVal count As Integer)
End Sub

' 戻り値あり
Public Function GetMessage() As String
End Function

' オーバーライド可能
Public Overridable Sub OverridableMethod()
End Sub

' オーバーライド
Public Overrides Sub OverridableMethod()
End Sub

' 再定義
Public Shadows Sub ReDeclareMethod() {
}

プロパティ

プロパティ

C#
private string name;
// プロパティ
public string Name {
    get { return name; }
    set { name = value; }
}

// 読み取り専用プロパティ
public string ReadOnlyName {
    get { return name; }
}
VB.NET
Private _name As String
' プロパティ
Public Property Name() As String
    Get
        Return _name
    End Get
    Set(ByVal value As String)
        _name = value
    End Set
End Property

' 読み取り専用プロパティ
Public ReadOnly Property ReadOnlyName() As String
    Get
        Return _name
    End Get
End Property

ジェネリック

ジェネリック

C#
List<string> strList = new List<string>();
strList.Add("Hoge");
strList.Add("Fuga");

// クラス定義
class GenericHoge<T> {
    public T GetValue() {
    }
}
VB.NET
Dim strList As List(Of String) = New List(Of String)
strList.Add("Hoge")
strList.Add("Fuga")

// クラス定義
Class GenericHoge(Of T)
    Public Function GetValue() As T
    End Function
End Class

Nullable型

Nullableもある。

C#
int? i = null;
VB.NET
Dim i As Integer? = Nothing

型推論

型推論、これは.NET 3.5(C#3.0、VB9)からの機能

C#
var strVal = "Hello";
var intVal = 1;
VB.NET
Dim strVal = "Hello"
Dim intVal = 1

ラムダ式

ラムダ式

C#
Func<int, int, int> func = (x, y) => x * y;

func(2, 3);
VB.NET
Dim func As Func(Of Integer, Integer, Integer) = Function(x, y) x * y

func(2, 3)

こうも書ける

Dim func = Function(x As Integer, y As Integer) x * y

VB.NETの方が型推論が賢い

プリプロセッサ ディレクティブ

VBにもできたのね

C#
#define HOGE

#if HOGE
    // HOGE
#else
   // not HOGE
#endif
VB.NET
#Const HOGE = True

#If Hoge
    ' HOGE
#Else
    ' not HOGE
#End If