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を使うことになると思いますが、これがなかなかうまくいきません。

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

コーちゃん

孫のコーちゃんは、2歳5ヶ月になりました。

こちらの言うことのオーム返しが出来るようになり、単語が大分増えました。
「おとうさん」、「おかあさん」は発音があまり上手でなく、
状況がわからないと何といっているか分かりません。

「じいちゃん」ははっきり発音し、時々「じいちゃん」を連発します。
わたしはコーちゃんが大好きですし、
コーちゃんも私が気に入っていると思います。

同年輩の幼児に比べて並外れて活発で、
わたしと散歩する時などそこらじゅう駆け回り、
50センチ程度のところからは飛び降ります。
顔には小さな傷が絶えません。
大きな怪我をしないことを祈っています。

好き嫌いがハッキリしていて、
何でも「好き」、「嫌い」を即答します。
恐らく母親が可愛がりすぎたためだと思いますが、
母親には強烈に駄々をこねます。

親がいないとき私に対してはとてもいい子です。
私のいうことをよく聞いてくれます。

コーちゃんは活発で頭のいい子だと思っていますが(爺馬鹿です)、
唯一気がかりなのは、少し年上の子に無条件で近づいていくことです。

おとなに媚を売るのではないので、
そのような心配ではないのですが、
少し年長の子にはほぼ必ず近づいていき遊ぼうとします。
恐らく、今いい遊び友達がいないのだろうと思います。
同年輩の子供とは波長があわないので、
「いい兄貴が見つかるといいのだが」と思っています。
4月から幼稚園にいくので友達ができることを期待しています。

妻は九州の実家に手伝いにいっていますので、
時々私はコーちゃんと二人きりでお出かけします。
そういうとき私はコーちゃんの家に迎えにいき、
半日コーちゃんと遊んで、彼の家に送っていきます。

お正月妻が我が家に帰ってきました。
4日には、コーちゃんを我が家で遊ばせようと息子に連れてきてもらいました。
遊んでいる間に息子はこっそりと帰ったのですが、
しばらくすると、お父さんを探し始め、「おとうさん、おとうさん」と悲しがります。
彼はお父さんと一緒に来たのであり、
「お父さんがいなくなった」という認識があります。
わたしが彼を連れ出すときは、そのような悲しがりはしません。
「じいちゃん」とのお出かけで親から分かれてきた状況と、
気がついたら親がいなくなったのでは違うのでしょう。

6日には妻と私とコーちゃんでデパートに行きました。
母親と一緒のときはわがままが出るのですが、
お子様ランチはどれも「嫌い」を言わず食べました。

お子様ランチのおまけにオモチャがついていて、
かごの中からプラスチックの包丁で切るトマトのオモチャをもらいました。
家にすでに一式持っているのですが、
とても好きでトマトの真ん中をマジックテープでくっつけたり、
包丁で切ったりして遊んでいます。

食事がすんであまりにチョロチョロするので、
私はコーちゃんを抱き上げて妻の買い物に移動途中トマトを落としてしまい、
衝撃でトマトが欠けました。
コーちゃんはとても悲しそうに「おかあさーん」と泣きそうになります。

妻が食器を物色している間、
コーちゃんと階段に座って、「チューリップ」の合唱をしました。
「さいた さいた チューリップの花が、 
ならんだ ならんだ あか しろ きいろ」
全部は歌えませんが、節回しのところどころで声を出して、
彼なりに精一杯歌います。

この世に生を受けて僅か2年半で歌を歌うようになる子供の成長に感動します。

息子がもしかしたら引越します。
とても悲しく思っています。

人生を変える

今若者が学校を出ても職につけなくて大変厳しい時代が続いています。

私が若い頃はまだ日本に貧乏があって、私の通っていた公立中学から高校に進学したのは、男子で1/3、女子では1/5程度ではなかったでしょうか(もっと少なかったかもしれません)。さらに公立高校から大学に進学したのは同じく男子で1/3、女子も1/5程度だったのでしょう。

当時が今と人々の気持ちで違うのは、当時はたとえささやかであっても、それぞれが「目標」を持てたということでしょう。一つは「アメリカ」が象徴する豊かさへの憧れであり、可能性への期待感があったと思います(可能性を求めて多くの若者が東京を目指しました)。

今の時代は、私たちの時代より数倍物質的には恵まれていますが、心のよりどころをどこにも求めることのできない絶望感があるもかもしれません。

 

私は戦中生まれで、西日本の1地方都市で育ちました。私の父は建築の職人(親方)で、兄3人も父の手伝いをしていました。

私は男ばかり6人兄弟の4番目で、兄弟の中で唯一公立高校に進学し、職人一家の中では「出来る」子供でした。

しかし公平にみれば高校は中くらいの成績で平凡な生徒でしたが、それでものんきに地元の大学に進学して、将来は建築家になることを夢みていました。

家計のことは無関心でしたが、恐らく父の会社は経営が困難になっていて、私を大学に進学させる経済的余裕がありませんでした。

高校3年の正月を前に、父と一緒に働いていた兄から「大学にはやれない」と涙ながらに告げられました。
頭が真っ白になりました。
卒業を間近に就職活動を始めてみても、どこも使ってくれるところはありませんでした。

残された道は私も兄達と同じく父の仕事を手伝うことでした。

3月になると高校の授業もなく、それぞれに就職や進学の準備をしています。
とても皮肉なことに父は地元の大学の工事を請け負っていました。
国立大学の発表の日でした。
天気のいい寒い朝だったと思います。
私も朝から大学の建築現場で、鍬を使ってトロ箱でモルタルを捏ねていました。

誰かが私の目の前を通りすぎようとしています。
「ふっと」目をやると、数日前まで席を同じくしていたクラスメートでした。
小倉君と井口君と北川先生です。

私は声を上げることができませんでした。
かれらが私に気づいたのかどうか知りません。
影絵のように彼らの横顔が「スーと」通り過ぎていきました。
今も鮮明に覚えています。
目の前何メートル先だったのでしょうか。
遠い昔の映像は今も私の脳裏に焼きついたままです。

「なぜこういうことになったのか」私は深く反省しました。
「誰のせいにすることも出来ない」。
「すべては自分のせいだ」。

しばらく建築現場で働きました。
幸い兄弟が沢山いたので兄弟のサポートを受け、2年遅れて地元の(そう私自身土方仕事をしていた)国立大学の建築学科に進むことができました。

 

私は意志の強さを信じています。

「同じ人間に出来ることが自分に出来ないはずがない」と。
(スポーツ等生まれながらの身体能力にかかわることでない限り)

僭越ですが、苦悩する若者にエールを送りたいと思います。
「負けるな」

VB to C# 3

VBプロジェクトからC#プロジェクトへの書き換えは、
次のように三つのプロジェクトを開いて作業しています。
一つ目はオリジナルのVB2010プロジェクト(以下[VBPro]といいます)、
二つ目はSharpDevelopで変換したC#プロジェクト(以下[SDevPro]といいます)、
三つ目は新規のC#プロジェクト(以下[新規Pro]といいます)です。

最初は二つ目のプロジェクト[SDevPro]ですべて作業していたのですが、
SharpDevelopの変換は不十分で、
それに沢山の修正を加えてゴチャゴチャにするよりも、
新たにプロジェクトを構築していく方がすっきりしてよいと気づき、
新規のプロジェクトを一から構築することにしました。

まず、Formを継承していないクラスファイルは問題が少ないので、
ほぼそっくり[SDevPro]から[新規Pro]にコピーします。

VBはすべてがいい加減で(言葉は適切ではありません)、
C#はすべてが厳密だという問題が出てきます。

すぐ問題になるのが名前空間[namespace]です。
プロジェクトが大きくなるとサブフォルダを作ることは至極当然です。
VBでは、特に[namespace]を気にしなければ、
フォルダに関係なく一つの名前空間の下に管理されます。
C#ではフォルダをつくり、その中にクラスなりフォームなりを作成すると、
そのクラスの[namespace]は、
[ルート名前空間 + ドット + フォルダ名]になります(Javaと同じです)。

プロジェクトのなかでも別のフォルダを使うときには、
[using]で必要なサブフォルダ=[namespace]を呼び込んでおかなければなりません。

後でフォルダ名を変えたり、ファイルの移動をしたりするとどうなるか。
ソリューション エクスプローラでファイルを[切取]、[貼り付け]でフォルダを移動しても、
[Visual SourceSafe 2005]は問題ありませんが、
当該クラスで記述した[namespace]は自動では変更してくれませんので、
手動で変更しなければいけません。

100%ではありませんが、
この辺りはVS2010の[リファクター]やDecXpressの[RefactorPro!]が十分働いてくれます。

フォームを継承したクラス(要するにForm)のデザイン画面は、
[VBPro]の画面をコピーし貼り付けても問題ないようです。
コードは[SharpDevelop]で変換した[SDevPro]のコードをコピーします。

どちらにしても自動変換の後はたくさんのエラーが表示されます。

VBメソッドの[Optioal]はC#でサポートしていない」ので、
一部書き換えを始めていましたが、C#2010からC#でもこれをサポート。
C#ではもっと簡単に、
引数定義の後ろに[=]に続いてデフォルト値を書くだけでいいと分かり(たとえば[= true])、
「よかった!!」という感じです。
実はこの変更もどのように統一的な形にするか悩んでいました。

C#への書き換えで気づいたのは、
VBのプログラミングムでは私自身「ずいぶんいい加減に書いてきたな」ということです。

その一つが、[ByRef]の使い方です。
メソッド側で変更がある場合は、碌に考えもしないで[ByRef]を使っていました。
VBでは害にもならないのですが、
C#ではコールする側にも[ByRef]に相当する[ref]を書かなければいけません。
しかもコールする側でこの変数に値を代入しておかなければエラーになります(VBでは警告)。

反対にメソッドを呼ぶ側でなく、呼ばれるメソッド側で値を作る場合は、
呼ぶ側も呼ばれる側も[out]キーワードを付けなければいけませんし、
呼ぶ側は変数定義だけでにしておかなければいけません。
呼ぶ側で変数に値を設定するとエラーになります。

もう一つ面倒なのは、C#で参照渡し([ref]あるいは[out])でメソッドを呼ぶとき、
オブジェクトの[プロパティ]を引数に渡すことはできません。
例えば、商品台帳(クラス)の価格プロパティをメソッドで変更しようとして、
価格プロパティだけをメソッドに渡すことができません。
プログラムを改変する必要があります。
この辺りは「C#は融通が利かない」とみるか、「厳密でいい」とみるか意見の分かれるところです。

現在DBでは[Ado.Net]、[Linq to SQL]、[Linq to EF]を節操もなく使っていますので全面見直しです。
まだ先は長そうです。

どちらにしても、
[VB to C#]の変換作業はVBプログラマにとって最も効率のいいC#の勉強法だと思います。

C# 参考書

昔-Windows以前の世界では-FortranやCを使っていて、
オモチャっぽいBasicは好きではありませんでした。

WindowsでVBが発売されたとき、
統合開発環境=IDEの充実した言語としては他にVC++しかありません。
VC++のフレームワークはあまりにゴチャゴチャしていて、
予想どおり大多数の人はVC++を使って来ませんでした。

私もVC++はあまり使わず、結局長い間VBを使ってきました。
VBの教科書としてはBalenaの翻訳本がとてもいいと思います。
BalenaがVB.NETに書き換えたとき躊躇せず購入しましたし、
VB2005の解説書も購入しました。
私は完全にBalenaを信頼しています。

今回本格的にC#の勉強をしようと参考書を物色しましたが、
日本語の「いい教科書がない」と痛感しました。
書店には「・・・入門」はたくさんありますが、中級以上の本がない。

私はよく思います。
「なぜ日本語のいい教科書がないのだろう」と。
理由は色々あると思いますが、一つは投資対効果でしょう。
一冊の本をしっかり書くことは大変な労力を必要としますが、
数年でバージョンが変わるソフトを追いかけて、
大して売れもしないうちに次々教科書を出版するのは採算に合わないのでしょう。

英語圏であればそれなりの購買層があるが、
日本語に特化すると商売にならないのでしょう。
結局私たちは中級以上の本は賞味期限を過ぎた翻訳本か、
それが嫌なら原書を読むしかありません。

ついでですが、「調べる」にはオンラインヘルプはいいが、
「勉強」には本の方が数段勝ると思います。

今回C#のプログラムを書くにあたって、いい教科書に出会えません。
[プログラミング VIsual C# 2005]はもはや話題が古くLINQ等の記述がありません。
[Pro C# 2010 and the .NET 4 Platfrom](Apress)は1600ページ以上あって、
英語ですから拾読みするには適当ではありません。通読する時間などありません。
[C# 4.0 In a nutshell](O’Reilly)がリファレンスとしては一番いいかもしれません。

出版社に提案があります(出版社がこのブログを読んでいるとは思いません。独り言です)。
日本語の[・・・入門]はやめて、英語の定評のある参考書の翻訳本を素早く出版していただきたい。
これは出版社に対してのお願いというよりマイクロソフトへのお願いです。
マイクロソフトは[Microsoft Press]だけでなく、
他社の書籍に対してもいい翻訳本を迅速に出す工夫をしていただきたいと思います。

いい教科書があるかどうかは、その言語が広く使われるかどうに大きく影響します。

このような状態では、英語に弱い日本のソフト技術者は、最前線からどんどん追いやられてしまいます。

インドや中国の技術者の進出を見れば、彼らの勢いを肌で感じるでしょう。
ソフトにかかわる人は、「彼らを使えば安く開発できる」とのんきなことをいっている場合ではないでしょう。
ソフトウェア技術者も英語の技術書を「読む」くらいは身につけなければいけません。

大学の教養科目の英語で「文学書」の一節を勉強するなど間違っています(私の学生時代)。
大学生になればそれぞれに教養として専門書が読めるようにすべきです。
専門書はそもそも文学書と違って「凝った」表現はないのです。
自分の専門分野に限れば単語も数多くあるわけではありません。
ある種「慣れ」で、母国語程度とはいきませんが、慣れればいくらでも読めるのです。

今の大学の教養授業は変わったのでしょうか。