Visual Basic .NET Language
Visual Basic 14.0の機能
サーチ…
前書き
Visual Basic 14は、Visual Studio 2015の一部として出荷されたVisual Basicのバージョンです。
このバージョンはVBの約130万行で最初から書き直されました。一般的な刺激を取り除き、一般的なコーディングパターンをよりクリーンにするために、多くの機能が追加されました。
Visual Basicのバージョン番号は、12から14に直進し、13を飛ばしました。これは、Visual Studio自体のバージョン番号付けに沿ってVBを維持するために行われました。
Null条件演算子
詳細なヌルチェックを避けるために、 ?.
演算子は言語で導入されました。
古い冗長な構文:
If myObject IsNot Nothing AndAlso myObject.Value >= 10 Then
今すぐ簡潔に置き換えることができます:
If myObject?.Value >= 10 Then
?
演算子は、プロパティのチェーンを持つときに特に強力です。次の点を考慮してください。
Dim fooInstance As Foo = Nothing
Dim s As String
通常は、次のような記述が必要です。
If fooInstance IsNot Nothing AndAlso fooInstance.BarInstance IsNot Nothing Then
s = fooInstance.BarInstance.Baz
Else
s = Nothing
End If
しかし、 ?
演算子は次のように置き換えることができます:
s = fooInstance?.BarInstance?.Baz
NameOf演算子
NameOf
演算子は、コンパイル時に名前空間、型、変数、メンバ名を解決し、それに相当する文字列で置き換えます。
ユースケースの1つ:
Sub MySub(variable As String)
If variable Is Nothing Then Throw New ArgumentNullException("variable")
End Sub
古い構文では、変数の名前を変更し、ハードコードされた文字列を間違った値にするリスクがあります。
Sub MySub(variable As String)
If variable Is Nothing Then Throw New ArgumentNullException(NameOf(variable))
End Sub
NameOf
では、変数の名前を変更するだけでコンパイルエラーが発生します。これにより、名前変更ツールの名前を変更することもできます。
NameOf
演算子は、括弧内の参照の最後のコンポーネントのみを使用します。これは、 NameOf
演算子で名前空間のようなものを扱うときに重要です。
Imports System
Module Module1
Sub WriteIO()
Console.WriteLine(NameOf(IO)) 'displays "IO"
Console.WriteLine(NameOf(System.IO)) 'displays "IO"
End Sub
End Module
また、演算子は、名前の変更のインポートを解決せずに入力された参照の名前も使用します。例えば:
Imports OldList = System.Collections.ArrayList
Module Module1
Sub WriteList()
Console.WriteLine(NameOf(OldList)) 'displays "OldList"
Console.WriteLine(NameOf(System.Collections.ArrayList)) 'displays "ArrayList"
End Sub
End Module
文字列補間
この新しい機能により、文字列の連結がよりわかりやすくなります。この構文は、同等のString.Format
呼び出しにコンパイルされます。
文字列補間なし:
String.Format("Hello, {0}", name)
文字列補間の場合:
$"Hello, {name}"
2行は等価で、どちらもString.Format
呼び出しにコンパイルされます。
String.Format
に、角括弧には単一の式(メソッド、プロパティ、NULLコアレス演算子などの呼び出し)を含めることができます。
ストリング補間は、実行時エラーの発生を防ぐため、 String.Format
よりも優先されるメソッドです。次のString.Format
行を考えてみましょう。
String.Format("The number of people is {0}/{1}", numPeople)
これはコンパイルされますが、コンパイラは引数の数がプレースホルダと一致するかどうかをチェックしないため、ランタイムエラーが発生します。
読み取り専用の自動プロパティ
読み取り専用のプロパティは、VB.NETでは常に次の形式で使用できました。
Public Class Foo
Private _MyProperty As String = "Bar"
Public ReadOnly Property MyProperty As String
Get
Return _MyProperty
End Get
End Property
End Class
Visual Basicの新しいバージョンでは、次のようにプロパティ宣言を短くすることができます。
Public Class Foo
Public ReadOnly Property MyProperty As String = "Bar"
End Class
コンパイラによって生成される実際の実装は、両方の例でまったく同じです。それを書く新しい方法は単なる手短である。コンパイラーは、引き続き読み取り専用プロパティーを戻すための_<PropertyName>
という形式の専用フィールドを生成します。
部分的なモジュールとインタフェース
部分クラスと同様に、新しいバージョンのVisual Basicでは、部分的なモジュールと部分的なインターフェイスを処理できるようになりました。構文と動作は、部分クラスの場合とまったく同じです。
部分的なモジュールの例:
Partial Module Module1
Sub Main()
Console.Write("Ping -> ")
TestFunktion()
End Sub
End Module
Partial Module Module1
Private Sub TestFunktion()
Console.WriteLine("Pong")
End Sub
End Module
そして部分的なインターフェース:
Partial Interface Interface1
Sub Methode1()
End Interface
Partial Interface Interface1
Sub Methode2()
End Interface
Public Class Class1
Implements Interface1
Public Sub Methode1() Implements Interface1.Methode1
Throw New NotImplementedException()
End Sub
Public Sub Methode2() Implements Interface1.Methode2
Throw New NotImplementedException()
End Sub
End Class
部分クラスの場合と同様に、部分モジュールとインタフェースの定義は、同じ名前空間と同じアセンブリに配置する必要があります。これは、モジュールおよびインタフェースの部分的な部分がコンパイル中にマージされ、コンパイルされたアセンブリには、モジュールまたはインタフェースの元の定義が分割されているという指示が含まれていないためです。
複数行の文字列リテラル
VBでは、複数の行に分割された文字列リテラルを使用できるようになりました。
古い構文:
Dim text As String = "Line1" & Environment.NewLine & "Line2"
新しい構文:
Dim text As String = "Line 1
Line 2"
#地域指令の改善
#Regionディレクティブはメソッドの内部に置くことができ、メソッド、クラス、モジュールにまたがることもできます。
#Region "A Region Spanning A Class and Ending Inside Of A Method In A Module"
Public Class FakeClass
'Nothing to see here, just a fake class.
End Class
Module Extensions
''' <summary>
''' Checks the path of files or directories and returns [TRUE] if it exists.
''' </summary>
''' <param name="Path">[Sting] Path of file or directory to check.</param>
''' <returns>[Boolean]</returns>
<Extension>
Public Function PathExists(ByVal Path As String) As Boolean
If My.Computer.FileSystem.FileExists(Path) Then Return True
If My.Computer.FileSystem.DirectoryExists(Path) Then Return True
Return False
End Function
''' <summary>
''' Returns the version number from the specified assembly using the assembly's strong name.
''' </summary>
''' <param name="Assy">[Assembly] Assembly to get the version info from.</param>
''' <returns>[String]</returns>
<Extension>
Friend Function GetVersionFromAssembly(ByVal Assy As Assembly) As String
#End Region
Return Split(Split(Assy.FullName, ",")(1), "=")(1)
End Function
End Module
暗黙の行継続の後のコメント
VB 14.0では、暗黙の行継続の後にコメントを追加する機能が導入されています。
Dim number =
From c As Char 'Comment
In "dj58kwd92n4" 'Comment
Where Char.IsNumber(c) 'Comment
Select c 'Comment
例外処理
コーディング中に予期しないエラーが頻繁に発生し、デバッグとテストが必要です。しかし時にはエラーが実際に予想され、それをバイパスするために、 Try..Catch..Throw..Finally..End Try
ブロックがあります。
エラーを正しく管理するには、コードが投入されるTry..Catch
せるブロック、 Catch
、名前の状態として、このブロックで発生するすべての例外をキャッチします。
例外が発生した場合、エラーをThrow
することができます。つまり、コード自体でユーザーに通知したり、内部的に管理したりすることができます。
Finally
部分は、結果がどんなものであれ、例外があるかどうかに関わらず、コードがブロック外に出る前に実行される最終コードです。
時計を飛び出さなければならない場合は、 Exit Try
文を使用することができます。しかし、ここでも、 Finally
セクションのコードは終了する前に実行されます。
構文はシンプルです。
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try
Try
and End Try
だけが必須です。残りの部分は無視することができますが、たとえ空白のままであっても、 Finally
部分を含めることをお勧めします。
例外になると、捕らえることのできるさまざまなタイプの例外があります。それらは、以下のように.Net Frameworkから利用可能な準備ができている例外です。
例外クラス | 簡単な説明 |
---|---|
System.IO.IOException | I / Oエラーを処理する |
System.IndexOutOfRangeException | 範囲外の配列インデックスを参照します。 |
System.ArrayTypeMismatchException | 型が配列型と一致しない場合 |
System.NullReferenceException | ヌルオブジェクトを参照して生成されたエラーを処理します。 |
System.DivideByZeroException | 被除数をゼロで割って生成されるエラーを処理します。 |
System.InvalidCastException | 型キャスト中に生成されたエラーを処理します。 |
System.OutOfMemoryException | 不十分な空きメモリから生成されたエラーを処理します。 |
System.StackOverflowException | スタックのオーバーフローによって生成されたエラーを処理します。 |
--------------------------- | ------------------------ |