09 C# vs VB.NET

 vs 


[Home]

 キーワード (Visual Basic)

C#VB.NET
If文
if (n == 0) {
  ...
}
else {
  ...
}
If n = 0 Then
  ...
Else
  ...
End If
Select Case文
switch (n) {
  case 0:
    ...
    break;
  case 1:
    ...
    break;
  case 2:
    ...
    break;
  default:
    ...
    break;
}
Select Case n
  Case 0
    ...
  Case 1
    ...
  Case 2
    ...
  Case Else
    ...
End Select
For文
for (i = 0; i <= 10; i += 2) {
  ...
}
For i = 0 To 10 Step 2
  ...
Next
For Each文
foreach (i in a) {
  ...
}
For Each i In a
  ...
Next
While文
while (i < 5) {
  ...
}
While i < 5
  ...
End While
Do While文
do {
  ...
} while (n < 5);
Do While i < 5
  ...
Loop

(Do Until ... Loop もある)
Return文
C#と同じ
Yield文returnと併用する。
Yieldのみ。繰り返し関数を作成するときはIteratorキーワードを付ける。

(サンプル)
Module Module1

Sub Main(ByVal args As String())
  For Each number In Power(2, 8)
     Console.Write(number & " ")
  Next
End Sub

Iterator Function Power(ByVal base As Integer, _
  ByVal highExponent As Integer) As _
  System.Collections.Generic.IEnumerable(Of Integer)
    Dim result = 1
    For counter = 1 To highExponent
        result = result * base
        Yield result
    Next
End Function

End Module

Continue文continueContinue ForやContinue Whileを使う。
Exit文
ループから抜けるときは、Exit ForやExit While, Exit Doを使う。
Goto文
C#と同じ
With文C#にはない
  Dim p1 = New Point(1, 5)
  With p1
    Console.WriteLine("{0}, {1}", .x, .y)
  End With
try catch finally文
try {
  ...
}
catch (Exception ex) {
  ...
}
finally {
  ...
}
Try
  ...
Catch ex As Exception
  ...
Finally
  ...
End Try
throw文
C#と同じ
using文 (アセンブリ参照)using文を使う。Imports文を使う。
using文 (リソース自動解放)
using (f = new StreamReader("...")) {
  ...
}
Using f = New StreamReader("...")
  ...
End Using

 

宣言

C#VB.NET
Enum
enum Fruit { Apple, Orange, Banana };
Enum Fruit
  Apple
  Orange
  Banana
End Enum
Delegate
delegate void Closure(Object x);
Delegate Sub Closure(Object x)
Class
class Class1 {
  ...
}
Class Class1
  ...
End Class
Module
static class Module1 {
  ...
}
module Module1
  ...
End Module1
Structure
struct Point {
  double r;
  double theta;
}
Structure Point
  Dim r As Double
  Dim theta As Double
End Structure
Shared
staticキーワード
Sharedキーワード (メソッドの修飾子などで使用)
Static
staticキーワード
Staticキーワード (メソッド内の変数宣言などで使用)
Event
宣言
public delegate void Notify(string msg);
public event Notify nofify1;

登録
notify1 += Inform;

発生
notify1("Raise Event!!");
宣言
Public Delegate Sub Notify(ByVal msg As String)
Public Event Notify notify1

登録
AddHandler notify1, AddressOf Inform

発生
RaiseEvent notify1("Raise Event!!")

(サンプル)
Public Delegate Sub Notify(ByVal msg As String)

Module Module1
Event notify1 As Notify

Sub Main(ByVal args As String())
  AddHandler notify1, AddressOf Inform
  RaiseEvent notify1("Raise Event!!")
End Sub

Sub Inform(ByVal msg As String)
  Console.WriteLine(msg)
End Sub

End Module

(参考)
Handlesキーワードを使ってイベントを受け取る事もできる。
Imports
usingキーワード (アセンブリ参照)
Importsキーワード
SyncLock
lockキーワード
SyncLockキーワード

(サンプル)
SyncLock buff
  ...
End SyncLock

 

関数・演算子

C#VB.NET
算術演算子
++, --演算子がある。
^ (べき乗) はない?
% (余り)
\ (整数の商)はない?
++, --演算子はない。
^ (べき乗) がある。(例)2^2=4
Mod (余り)
\ (整数の商) がある。
ビット演算子
&
|
^
~
And
Or
Xor
Not
論理演算子
&&
||
And
Or
AndAlso
OrElse
IsTrue
IsFalse
文字列演算子
+
+ または &
ByVal, ByRef
ByValがデフォルト、ByRefはrefを使う。
パラメータの値渡し(ByVal)、参照渡し(ByRef)。
参照渡しにすると、呼び出し元の変数の値が変更される可能性がある。
ParamArray
int AddAll(params int a[]) {
  ...
}
Function AddAll(ByVal ParamArray a As Integer()) As Integer
  ....
End Function
Optional
int Times(int n, int m = 0) {
  ...
}

注意: C#4以上が必要
Function Times(ByVal n As Integer, ByVal Optional m As Integer = 0) As Integer
  ...
End Function
名前付きパラメータ
定義は一般のメソッドと同じ
呼び出し
test(y:1, x:2);
(注意) C#4以上が必要
定義は一般のメソッドと同じ
呼び出し
test(y:=1, x:=2)
Win32 API
アセンブリ参照
using System.Runtime.InteropServices;

Win32 API関数の宣言(例)
[DllImport("kernel32.dll")]
public static extern void GlobalMemoryStatusEx(ref MEMORYSTATUSEX Buffer);

(例)
Imports System.Runtime.InteropServices

Class Win32API
  <DllImport("kernel32.dll", CharSet := CharSet.Auto, SetLastError := True)>
  Friend Shared Function GetLastError() As UInt32
  End Function
End Class

Module Module1
  Sub Main(ByVal args As String())
    Dim err As UInt32 = Win32API.GetLastError()
    Console.WriteLine(err)
  End Sub
End Module

Visual Basic 6.0 互換関数
存在しない。
型変換関数
CBool(expression)
CByte(expression)
CChar(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CObj(expression)
CSByte(expression)
CShort(expression)
CSng(expression)
CStr(expression)
CUInt(expression)
CULng(expression)
CUShort(expression)
CType(expression, typename)

数値演算関数
Abs(expression)
Atn(expression)
Cos(expression)
Exp(expression)
Log(expression)
Round(expression)
Sgn(expression)
Sin(expression)
Sqr(expression)
Tan(expression)

変換関数
Asc(string)
AscW(string)
Chr(charcode)
ChrW(charcode)
Format(expression, style)
Hex(number)
Oct(number)
Str(number)
Val(expression)

 

データ

C#VB.NET
特殊な値
null
true
false
Nothing
True
False
整数
byte
short
int
long
uint
Byte
Short
Integer
Long
UInt32
浮動小数点数
double
float
Double
Single
論理型
bool
Boolean
文字と文字列
char
string
Char
String
配列
object[] arr = new object[10];
[] でなく ()を使う。

(サンプル)
Imports System
Imports System.Collections.Generic

Namespace Test
Module TestArray

 Public Sub Main(ByVal Args As String())
   Dim ia(2) As Integer
   ia(0) = 10
   ia(1) = 5
   Console.WriteLine("{0}, {1}", ia(0), ia(1))

   Dim arr As String() = { "大阪", "京都", "神戸", "大津", "和歌山" }

   Dim n As Integer = arr.Length
   Console.WriteLine("{0:d}", n)

   ReDim Preserve arr(n + 1)
   arr(5) = "岡山"

  For Each a In arr
    Console.WriteLine(a)
  Next
 End Sub

End Module
End Namespace
ジェネリック型
List<string> list = new List<string>();
型指定時にOfキーワードが必要。

(サンプル)
Imports System
Imports System.Collections.Generic

Namespace Test
Module TestList

 Public Sub Main(ByVal Args As String())
   Dim l As List(Of String) = New List(Of String)()
   Dim a As String() = { "大阪", "京都", "神戸", "大津", "和歌山" }

   l.AddRange(a)
   Console.WriteLine("{0:d}", l.Count)

   l.Add("岡山")

   For Each p In l
     Console.WriteLine("{0}", p)
   Next
 End Sub

End Module
End Namespace
Null許容型
int? i;
Dim i As Integer? または
Dim i? As Integer
関数型
関数名のみ
AddressOfキーワードが必要
ポインタ
使用可能
使用できない

 

クラス

C#VB.NET
継承
class Class1 : Class2 {
  ...
}
Class Class1
  Inherits Class2
  ...
End Class
staticクラス
static Class1 {
  ...
}
module Module1
  ...
End Module
インタフェース
宣言 interfaceキーワード
実装 クラスと同じ
宣言 Interfaceキーワード
(例)
Interface ITest
  Function IsSameType(ByVal a As Object) As Boolean
End Interface

実装 Implementsキーワード
(例)
Class Class1
   Implements ITest
  ...
End Class
this
this
Me
base
base
MyBase
コンストラクタ
クラス名と同じ
Sub New(...)
プロパティ
Propertyキーワードは不要。
読み出し専用プロパティにReadOnlyキーワードは不要。
Propertyキーワードが必要。

(サンプル)
 ' プロパティを含むクラス
 Public Class Class1
  Private num As Integer
  Private namae As String

  Public Sub New(ByVal n As Integer, ByVal s As String)
    num = n
    namae = s
  End Sub

  Public ReadOnly Property Number
    Get
      Return num
    End Get
  End Property

  Public Property Name
    Get
      Return namae
    End Get

    Set
      Me.namae = Value
    End Set
  End Property

 End Class
メソッドのオーバーライド
Overridableキーワードは不要。
overridesキーワードは必要。
オーバーライドできるメソッドにはOverridableキーワードが必要。
オーバーライドするメソッドにはOverridesキーワードが必要。

(サンプル)
 ' 基本クラス
 Class Class1
  Protected Name As String

  Public Sub New()

  End Sub

  Public Overridable Function GetMe() As String
    Return "Class1.GetMe()"
  End Function

  Public Overridable Function GetMyBase() As String
    Return "Class1.GetMyBase()"
  End Function

  Public Function GetMyClass() As String
    Return "Class1.GetMyClass()"
  End Function

 End Class

 ' 派生クラス
 Class Class2
  Inherits Class1

  Public Sub New()
    MyBase.New()
    Name = "Class2"
  End Sub

  Public Overrides Function GetMe() As String
    Return Me.Name
  End Function

  Public Overrides Function GetMyBase() As String
    Return MyBase.GetMyBase()
  End Function

  Public Function GetMyClassX() As String
    Return MyClass.GetMyClass()
  End Function

 End Class
メソッドのオーバーロード
メソッドの引数の型や数の違いによりオーバーロードを識別する。
C#と同様。(Overloadというキーワードは存在しない)
sealed
sealed
NotOverridable
abstract
abstract
MustOverride
演算子メソッド
operator
Operator

(サンプル)
Class Class1
Public content As String

Public Sub New(ByVal s As String)
  content = s
End Sub

Public Shared Operator - (ByVal src As Class1, ByVal target As String) As String
  If src.content.IndexOf(target) >= 0 Then
    Return src.content.Replace(target, "")
  Else
    Return src.content
  End If
End Operator

End Class

Module Module1

  Sub Main(ByVal args As String())
    Dim o As New Class1("123456")
    Console.WriteLine(o - "123")
  End Sub

End Module
イベントハンドラ
Handlesキーワードはない。
Handlesキーワードを使用する。
Visual Studio を使う場合は、自動的にプロトタイプが実装されるので意識する必要はない。

 

C#3以降のトピック

C#VB.NET
ラムダ式 (3.0)
(...)=>{ ... }という書式を使う。
SubやFunctionキーワードを使う。

(サンプル)
Imports System
Imports System.Collections.Generic

Namespace Test

Public Delegate Function Selector(ByVal x As Object) As Boolean

Module LambdaTest

Dim li As New List(Of Integer)

Sub Main(ByVal Args As String())
  ' Functionのラムダ
  AddIf(-1, Function(x) TypeOf(x) Is System.Int32)
  AddIf("ABC", Function(x) TypeOf(x) Is System.Int32)
  AddIf(1024, Function(x) TypeOf(x) Is System.Int32)
  AddIf(3.14, Function(x) TypeOf(x) Is System.Int32)

  ' Subのラムダ
  li.ForEach(Sub(x) Console.WriteLine("{0}", x))
End Sub

Sub AddIf(ByVal x As Object, ByVal f As Selector)
  if f(x) = True Then
    li.Add(x)
  End If
End Sub

End Module
End Namespace

コレクション初期化子 (3.0)
{ }内に要素一覧を記述する。
C#に準じる。

(サンプル)
 Public Sub Main(ByVal Args As String())
   Dim l As List(Of String) = New List(Of String)() From { "八王子", "町田", "立川" }
   Dim a As String() = { "大阪", "京都", "神戸", "大津", "和歌山" }

   l.AddRange(a)
   Console.WriteLine("{0:d}", l.Count)

   l.Add("岡山")

   For Each p In l
     Console.WriteLine("{0}", p)
   Next
 End Sub

匿名型 (3.0)
型名を指定せず、new演算子でデータを作成する。

(サンプル)
var a = new {
      Key = "アメリカ",
      Value = "ワシントン",
  };
New Withキーワードを使い作成する。

(サンプル)
Dim data = New With {
   .name = "Tom",
   .age = 20
}
拡張メソッド (3.0)staticクラスを用意して、拡張メソッドをその中で定義する。第一引数にthisキーワードを使う。
System.Runtime.CompilerServicesをインポーとする。
モジュールを用意し、その中で拡張メソッドを定義する。
拡張メソッドにはExtension()属性を指定する。

(サンプル)
Imports System.Runtime.CompilerServices

Module StringExtensions
    <Extension()>
    Public Sub Print(ByVal aString As String)
        Console.WriteLine(aString)
    End Sub
End Module

Module Test
Sub Main()
  Dim example As String = "Hello"
  example.Print()
End Sub
End Module
LINQ (3.0)
from .. in .. where .. select構文を使う。
From .. In .. Where .. Select構文、または次のようなメソッドを使う。

(サンプル)
Imports System
Imports System.Collections.Generic

Namespace Test

Module LinqTest

Sub Main(ByVal Args As String())
  Dim data = Enumerable.Range(1, 100)
  Dim query = data.Where(Function(x) x Mod 5 = 0)
  For Each a In query
    Console.WriteLine("{0}", a)
  Next
End Sub

End Module
End Namespace
dynamic型 (4.0)varキーワードの代わりにdynamicキーワードを使って変数を宣言する。
Dynamicキーワードは存在しない。
System.Dynamic名前空間のクラスを直接使用する。
タスク並列処理 (4.0)
VB.NETと同様。
System.Threading.Tasks名前空間のParallel.Invokeメソッドを使う。

(サンプル)
Parallel.Invoke(
  Sub()
    For i As Integer = 0 To 5
      Console.WriteLine("A " & i)
      Thread.Sleep(1)
    Next
  End Sub,
  Sub()
    For i As Integer = 0 To 5
      Console.WriteLine("B " & i)
      Thread.Sleep(1)
    Next
  End Sub
)
引数の省略と順番の変更 (4.0)C#のみの追加機能。VB.NETでは以前のバージョンから可能。
async/await (4.5)async/awaitキーワード
C#同様、Async/Awaitキーワードが用意されている。

(サンプル)
Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs)

  Me.button.IsEnabled = False
  Await Task.Run(Sub()
                     Thread.Sleep(3000)
                 End Sub)
  Me.button.IsEnabled = True

End Sub

 

 

 

Comments