C#から見たVB.NET
仕事でVB.NETを使う必要が出てきそうなので最近のVBがどうなっているのかチェックがてらメモしておく。
VBは7(.NET 1.0)までしか使っていないので、その後ジェネリックとかがどのように取り込まれたか全く知らないのでそのへんも気になる。
基本的な相違点
リテラル
ちょこちょこ違う
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;
配列
配列の生成とアクセス
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#
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 | クラス内と継承したクラス、アセンブリ内 |
クラス
クラス(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
型推論
型推論、これは.NET 3.5(C#3.0、VB9)からの機能
C#
var strVal = "Hello"; var intVal = 1;
VB.NET
Dim strVal = "Hello" Dim intVal = 1