VB8から新しく導入された概念の一つに、演算子のオーバーロードがあります。 書式はC#の場合とほとんど一緒で、Sharedなメソッドとして定義します。 演算子のオーバーロードを行うために、新しくOperatorキーワードが追加されています。 ここでは、簡単な例として複素数の実部と虚部をメンバ変数に持つ構造体Complexを定義し、複素数に対する四則演算を演算子のオーバーロードを用いることで各演算子で記述できるようにしてみます。
Imports System Structure Complex Private r As Double Private i As Double Public Sub New(ByVal r As Double, ByVal i As Double) Me.r = r Me.i = i End Sub Public Property Real() As Double Get Return r End Get Set(ByVal value As Double) r = value End Set End Property Public Property Imaginary() As Double Get Return i End Get Set(ByVal value As Double) i = value End Set End Property Shared Operator +(ByVal x As Complex, ByVal y As Complex) As Complex Return New Complex(x.r + y.r, x.i + y.i) End Operator Shared Operator -(ByVal x As Complex, ByVal y As Complex) As Complex Return New Complex(x.r - y.r, x.i - y.i) End Operator Shared Operator *(ByVal x As Complex, ByVal y As Complex) As Complex Return New Complex(x.r * y.r - x.i * y.i, x.r * y.i + x.i * y.r) End Operator Shared Operator /(ByVal x As Complex, ByVal y As Complex) As Complex Dim l As Double = y.r ^ 2.0 + y.i ^ 2.0 Return New Complex((x.r * y.r + x.i * y.i) / l, (x.i * y.r - x.r * y.i) / l) End Operator Public Overrides Function ToString() As String If 0.0 <= i Then Return String.Format("{0:F3} + i{1:F3}", r, i) Else Return String.Format("{0:F3} - i{1:F3}", r, -i) End If End Function End Structure Class OperatorOverloadSample Public Shared Sub Main() Dim c1 As New Complex(2, 3) Dim c2 As New Complex(4, 5) Console.WriteLine(c1) Console.WriteLine(c2) Console.WriteLine("c1 + c2 = {0}", c1 + c2) Console.WriteLine("c1 - c2 = {0}", c1 - c2) Console.WriteLine("c1 * c2 = {0}", c1 * c2) Console.WriteLine("c1 / c2 = {0}", c1 / c2) End Sub End Class
2.000 + i3.000 4.000 + i5.000 c1 + c2 = 6.000 + i8.000 c1 - c2 = -2.000 - i2.000 c1 * c2 = -7.000 + i22.000 c1 / c2 = 0.561 + i0.049
また、独自に定義したものに限らず、.NET Frameworkに用意されている幾つかの構造体でも演算子がオーバーロードされています。 例えばSystem.Drawing.Size構造体の場合について見てみるとこの例の通りです。
Imports System Imports System.Drawing Class OperatorOverloadSample Public Shared Sub Main() Dim sz1 As New Size(10, 20) Dim sz2 As New Size(50, 30) Console.WriteLine(sz1) Console.WriteLine(sz2) Console.WriteLine(sz1 + sz2) End Sub End Class
{Width=10, Height=20}
{Width=50, Height=30}
{Width=60, Height=50}
VB.NETでは.NET Frameworkで用意されている構造体等でオーバーロードされた演算子を使用することはできませんでしたが、VB8からはこの例のよう使用することができるようになっています。
VB8では次の演算子がオーバーロード可能です。
IsFalse, IsTrueは新しく導入された演算子です。 詳細は追って説明します。