サーチ…


前書き

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 スタックのオーバーフローによって生成されたエラーを処理します。
--------------------------- ------------------------


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow