C# と VB.NET の対応

 [Home] |  [Index]

投稿日 2015/06/24

 文

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 文
なし
Do Until i > 5
  ' 文
Loop
Return 文
return;
Return
Yield 文
yield return
Yield ' Return は不要
Continue 文
continue;
Continue ForやContinue Whileを使う。
Exit 文
break;
ループから抜けるときは、Exit ForやExit While, Exit Doを使う。
GoTo 文
goto LABEL;
GoTo LABEL;
With 文
なし。(キーワードの with はある)
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 文
throw Object;
Throw Object
using 文 (参照用)
using System.Text;
Import System.Text
using文 (リソース自動解放)
using (fs = new StreamReader(path)) {
  // 文
}
Using fs = New StreamReader(path)
  ' 文
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
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 list = new List();
'型指定時にOfキーワードが必要。

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

Namespace Test
Module TestList

 Public Sub Main(ByVal Args As String())
   Dim list As List(Of String) = New List(Of String)()
   Dim a As String() = { "大阪", "京都", "神戸", "大津", "和歌山" }
   
   list.AddRange(a)
   Console.WriteLine("{0:d}", l.Count)
   
   list.Add("岡山")
   
   For Each p In list
     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
プロパティ
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.0 以降の機能

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

 

このページのトップへ