C# 嫌いなところ

VB to C#の作業は、必要最小限のFormを書き換え、コンパイルエラーがなくなるところまで来ました。まだ沢山の警告が出ますので、これもつぶしていかなければいけません。

C#のいいところは、VBに比べて「オブジェクト指向」らしいというところです。オブジェクト指向の基本理念を守っていますので、使っていてある種安心感があります。オブジェクト指向の本筋を勉強できるかなと思います。

しかし、嫌いなところもあります。これはオブジェクト指向とは関係ない話だと思います。仕様を改定してほしいものです。

先ず、ブロックから抜ける方法です。
VBの[Exit ]構文は、

Exit { DO | For | Function | Property | Select | Sub | Try | While }

です。
ブロックがネストしている場合にも、指定のブロックから抜けることができます。例えば次のようなものです(一部、[Visual Basic .NET ランゲージリファレンス](マイクロソフトプレス)から)。

Sub ExitStatementDemo()
    Try
        Do
            For I As Integer = 1 To 1000
                Dim MyNum As = Int(Rnd * 1000)
                Select Case MyNum
                    Case 7: Exit For
                    Case 29: Exit Do
                    Case 54: Exit Try
                    Case 65: Exit Sub
                End Select
            Next I
        Loop
    End Try
End Sub

C#には[break]がありますが、これは一番内側の繰り返しブロックから抜けるだけです。tryブロックには使えません。

Javaでは、ブロックにラベルを付すことができ[break label]でそのブロックから抜けることができます。
(以下[Java クイックリファレンス](O’Reilly)から)

testfornull: if (data != null) {
    for (int row = 0; row < numrows; row++) {
        for (int col = 0; col < numcols; col++) {
            if (data[row][col] == null) break testfornull;
        }
    }
}

C#ではこれらの仕組みがありませんので、ネストした内側のブロックから抜けるためには、ラベルを用意しFortran流の[goto]を使うしかありません。エレガントではありません。

次はswitch文です。
VBではCase文に[式]等が使え柔軟です。

Dim Number As Integer = 8
Select Number
    Case 1 To 5
        ...
    Case 6, 7, 8
        ...
    Case Is > 8
        ...
    Case Else
        ...
End Select

しかし、C#([switch])ではCase文のラベルには定数またはリテラルしか使えません。ラベルが列挙子や文字列だけならいいですが、でなければif文を書いた方がいいくらいです。

ついでに嫌な部分を書けば、関数コールで参照渡しを使う場合、オブジェクトのプロパティを渡せないことです。オブジェクトそのものを渡すか、関数コールの前後に作業用の変数を用意しなければならない、ことも大変面倒です。

例えば、沢山のテーブル(クラス)が[更新日]列を持っていて、レコードに変更があれば更新日を書き換えるものとします。クラスの[更新日]プロパティでなく、クラスそのものを参照渡しにすると、クラスの数だけ関数を用意しなければいけません。これではあまりにひどいので汎用化したいのです。ジェネリック(多分だめ)かインターフェースかAbstractを使うことになると思いますが、これがなかなかうまくいきません。

まだ十分研究していませんが、これはこれでコツを掴まなければいけないのだろうと思っています。

error: コピーできません !!