今、はじめてVisual Basicに触れるあなたへ

f:id:ecb_YugamiShun:20220328085834p:plain
Visual Basic Logo

はじめに

こんにちは!

おひさしぶりです。ecbeing システムエンジニア湯上です。

あっという間に2022年も4月を迎え、新年度が始まりましたね!

ようやく新卒3年目が始まるタイミングではありますが

すでに体半分アーキテクトのような立ち回りが増えてきたように感じています。


さて、ちょうど2年前の記事になりますがこんな記事がMicrosoftから公開されました。

devblogs.microsoft.com

Going forward, we do not plan to evolve Visual Basic as a language.

端的に言えば、上記の記事は「Visual Basicは今後言語的な進化をしない。」というMicrosoftの表明です。

「息抜きC#シリーズ」を読んでいただいているモダンなC#erの皆様には、全く関係のない話かと思います。


宮原さんの「息抜きC#」最新記事はこちらから↓

blog.ecbeing.tech


今回はMicrosoftの記事の主役であるVisual Basic(以下VBと表記)について

  • どのような言語か?
  • どの程度モダンな(C#と同じ)書き方ができるのか?

という観点でまとめてみたいと思います。

目次

VBとは?

.NET上で動作する自然言語に近い文法で記述することが出来るプログラミング言語です。 そのため比較的初心者向けの言語といわれています。 英語圏の初心者コーダー向けといったところでしょうか。

こんにちは世界

文法を確認するために若干遠回りをしてHelloWorldを出力してみましょう。

Module Test
    Sub Main()
        Dim message As String = GetMessage()
        Console.WriteLine(message)
    End Sub
    Function GetMessage() As String
        Return "Hello, World."
    End Function
End Module
'出力: Hello, World.

特徴

上記の例から見てとれるVBの特徴として以下の2つがあります。

1. SubとFunction

C#では特に区別しませんが、VBでは戻り値の有無によってプロシージャの名前を明確に使い分ける必要があります。

C系の言語を先に学習しているとまず戸惑う点だと思います。

//C#
//戻り値がvoid型の関数
void Hoge()
{
    //何かの処理
}
//戻り値がint型の関数
int Fuga()
{
    return 0;
}
'VB
'Subプロシージャ
Sub Hoge()
    '何かの処理
End Sub
'戻り値がInteger型のFunctionプロシージャ
Function Fuga() As Integer
    Return 0
End Function
2. Moduleの存在

VBにはモジュールという仕組みが存在します。

関数や変数、プロパティをまとめるという意味ではクラスと似ていて、静的クラスのようにインスタンス化することが出来ません。

また大きな特徴として、外部から定義された関数を呼び出す際にモジュール名を指定する必要がなく直接関数名だけで呼び出すことが出来ます。

Module Hoge
    Sub Fuga()
        '~何かの処理~
    End Sub
End Module

Class Test
    Sub Main()
        Fuga() 'モジュール名の指定が不要
    End Sub
End Class

コード量の削減が期待できますが、大規模なシステムではどのモジュールによって関数が公開されているのかが分かりにくくなったり、関数名の衝突が起きやすくなったりするため、使用には注意が必要です。


C#で近い概念としてusing staticがあります。

using static {namespace名}.{class名} のように書きます。

// Test.cs
namespace Test1
{
    class Hoge
    {
        public static void Fuga()
        {
            //~何かの処理~
        }
    }
}
// Hoge.cs
using Test1;
using static Test1.Hoge;

namespace Test2
{
    class Test
    {
        public static void Main()
        {
            // Hoge.Fuga(); 普通はこのように呼び出す
            Fuga(); //using staticするとクラス名の指定が不要
        }
    }
}

ある意味VBのモジュールではC#でのusing staticが省略されていると考えることもできますね。


C#ユーザー向け!VBでも使える(比較的)モダンな機能2選

ここまでは、VBの基本的な文法についてまとめました。

次は私の独断と偏見で選んだ「VBでも使える(比較的)モダンな機能2選」をご紹介しようと思います。

タプル

C#やPythonなどでは一般的に利用されるタプルですが、VBでも利用することが出来ます。

定義

さっそく定義してみましょう!

C#と同じように()で囲うことでタプルを定義することが出来ます。

Dim day As Date = Date.Parse("2022/01/01")
Dim dayName As String = "元旦"
Dim isHoliday As Boolean = True

'定義
Dim dayInfo = (day, dayName, isHoliday)
呼び出し

呼び出す際もC#と同じように利用することが出来ます。

Console.Write(dayInfo.Item1 & "は、")
Console.Write(dayInfo.Item2 & "で")
If (dayInfo.Item3) Then
    Console.WriteLine("休日です。")
Else
    Console.WriteLine("平日です。")
End If
’ 出力:2022/01/01は、元旦で休日です。


また、パラメータ名の推測も利用可能です。

Console.Write(dayInfo.day & "は、")
Console.Write(dayInfo.dayName & "で")
If (dayInfo.isHoliday) Then
    Console.WriteLine("休日です。")
Else
    Console.WriteLine("平日です。")
End If
’ 出力:2022/01/01は、元旦で休日です。
関数の戻り値にも

もちろん関数の戻り値としても利用可能です。

' dayやdayNameなどのパラメータ名を省略して型の指定のみでもOK
Function GetDayInfo() As (day As Date, dayName As String, isHoliday As Boolean)
    Return (Date.Parse("2022/01/01"), "元旦", True)
End Function

「関数から複数の値をまとめて返したいけど、わざわざDTOを作成するほどのデータでもないよなぁ。。。」 というときなど利用場面は多くあるのではないでしょうか。

Null 条件演算子(?./Array?())

2つ目は、Null 条件演算子です。

こちらもC#やJavaScriptなどでよく利用されていますが、VBでも利用可能です。

起こしがちな例外の一つのNullReferenceExceptionを簡単に回避できるようになっています。

配列の長さを取得したいとき
Dim array As Integer() 'Nothingな配列

Dim len As Integer = array.Length 'もちろんNullReferenceException

↑の例は極端ですが、配列が関数の引数に渡された場合などコーディング時には分かりにくい場合もあります。

これを回避するためには、条件分岐が必要になり少し手間です。

Dim array As Integer() 'Nothingな配列

Dim len As Integer?
If Not IsNothing(array) Then
    len = array.Length
Else
    len = Nothing
End If

しかしNull 条件演算子を利用すると簡潔に記述することができます。

Dim array As Integer() 'Nothingな配列

Dim len As Integer? = array?.Length 'len = Nothingとなる
bool型のプロパティを利用するとき

↑はLengthを例に挙げたため、実際のコーディングにあてはめにくいかもしれませんが、 bool型のプロパティへのアクセス時に非常に有効です。

Dim hoge As Hoge 'Nothingなインスタンス

If hoge?.Exists Then 'エラーとならずIf文は実行されない
    '~hogeを利用した処理
End If
配列へアクセスするとき

また配列へのアクセス時にも利用できます。

Dim array As Integer() 'Nothingな配列

Dim data As Integer? = array?(0) 'エラーとならず data = Nothingになる

Nullチェックを省略しつつも安全にアクセスできるため、こちらも利用場面は多くあるのではないでしょうか。

おわりに

ここまでご覧いただきありがとうございます。

今回の記事は「息抜きC#」シリーズに触発されてVBで同じような企画をやってみたらどうなるのかというところから始まりました。

レガシーといわれて久しい言語ですが、思ったよりモダンな記法も使えるんだなと感じました。

しかし言語の機能追加について時系列を追って確認してみましたが、

そのスピードや量を見ても、やはり同じプラットフォーム上のC#と比較するとその差は小さくないと感じます。


ecbeingではモダンを追い求めるエンジニアを募集しています!! careers.ecbeing.tech

参考

記事中のソースコードはMicrosoftの公式ドキュメントを参考にさせていただきました。

docs.microsoft.com docs.microsoft.com