アーカイブ

Posts Tagged ‘Visual Basic’

VB14で新しく増える構文で個人的に気に入っている構文ベスト3

VB TeamブログでVB14で採用される新しい構文について解説のエントリーが上がっています。
New Language Features in Visual Basic 14 (non-animated)

全体的に今までむず痒かった部分に手が入った感じですね。個人的にベスト3上げるとこの辺りが特に嬉しい!!

1位. 文字列の拡張書式構文

String.Formatの糖衣構文ですね。今までのString.Formatよりも可読性が上がって良い感じです。

まだPreviewには入っていないようです。(なんて訳せばいいんだろう。。。)

2位. 行継続中のコメント

これもなにげに嬉しい。VB10で行継続が明らかな場合は行継続子(_)が不要になりましたが、行継続中のコメントは相変わらず受け入れてくれなかったんですよね。

3位 ?.オペレーター

?.オペレーターは今までのVBから見るとちょっと驚く構文ですよね。記号っぽい構文はできるだけ採用してこなかったVBなのでびっくりしましたが、シンプルに書けるのは良い感じです。

まだ確認していないんだけれどこれらは糖衣構文なので、Visual Studio 14を使えばターゲーットフレームワークをVB14より低くしても問題ない機能ってことでいいのかな?

広告

@ITの@IT eBookでVBAの入門電子書籍が公開中

@ITでVBAの入門連載(Excelマクロ/VBAで始める業務自動化プログラミング入門)をPDFファイルにまとめたeBookが無料公開されています。VBAはExcelといった身近なツールでプログラミングを体験できるので、プログラミング入門としてはお勧めですよね。

@ITのeBookシリーズとしては今回のVBAを含め現在下記の3つのコンテンツが提供されています。

カテゴリー:雑記, タグ:

VBのUsing構文で変数を指定しない

データベースの更新を行うクラスの単体テストを書く場合、特別な環境がない場合はTransactionScopeを定義だけしてその中にテストコードを書きます(ロールバックを任せる)。

<TestMethod()>
Public Sub ドメインにグループが存在しない場合は0件のリストを返すこと()
    Const testDomain = "unittest.com"
    Using ts = New TransactionScope()
        ' このテストのクリーンアップ
        DeleteTestRow(testDomain)
        AddTestRow(testDomain)

        Dim node = GroupNode.FindByDomain(testDomain)
        Assert.IsNotNull(node)
        Assert.AreEqual(0, node.Count())
    End Using
End Sub

まぁいいんですけれど、ReShaperを使っていると、未使用の変数ということでTransactionScopeのインスタンスを一時的に格納しているtsという変数がグレーになります。

image

おもむろに ts = を消してみました。

image

あれ、エラーにならない。てっきりVBでは一度変数に受けないとだめだと思っていたんですが、この書き方もできるんですね。そういえば以前書いたこの記事でもWith句で変数を指定していなかった記憶があります。って事は少なくとも.NET 3.5時代はすでにできたんでしょうね。

With Hoge.FindById(1)
    .Remove()
End With

ただ、相変わらずCatch句では変数を指定しないとダメですね。まぁ構文上しょうがない気もするけれど。

image

VS2008,2010ではOption Infer On, Option Strict Offが既定なんだ。

VBで型を省略したときの振る舞いをみていて、あれ?既定では暗黙の型変換の禁止(Option Strict)はOffなんだし、これでInvalidCastExceptionでるのか?と思ったら、型推論の利用(Option Infer)はOnが既定だから、型推論でIntegerとして推論された変数aに文字列を入れると実行時にInvalidCastExceptionが発生するんですね。。。

Infer Onを既定とするなら、Strict Onも既定にして欲しかったな。とりあえず、Strict をOnにすればコンパイル時にはじけるので、実行時エラーでしょんぼりしたくなかったら型推論を利用する場合はOption Strictは必ずOnにしたほうがいいですね。

そもそも、そんなエラーが出るようなプロジェクトでStrictをOnに変更したら、至る所でコンパイルエラーになって大変そう。。。まぁコンパイルエラーになるけれど、実行時エラーよりはだいぶマシですよね。

となると、型推論が無い時代のソース(2005以前)からアップグレードしたプロジェクトだと大変だよな。とおもったら、Visual Studio 2008時点のOption Inferのヘルプにこんなのが書いてありました。

On または Off の指定がない場合、Visual Basic 2008 で作成されるプロジェクトの既定値は On になります。以前のバージョンからアップグレードされたプロジェクトの既定値は Off になります。

http://msdn.microsoft.com/ja-jp/library/bb384665(v=VS.90).aspx

この記述2010のヘルプだと消えているんだけれど、2010でアップグレードした場合はどうなるんだろう。
→ ローカル型の推論のヘルプにアップグレードウィザードを利用したらInfer はOffになるって記述を発見

コード内で Option Infer の値を指定しなければ、コンパイラは既定で Option Infer On になります。 Visual Basic 2008 以前からアップグレードされたプロジェクトの場合、コンパイラは既定で Option Infer Off になります。

http://msdn.microsoft.com/ja-jp/library/bb384937.aspx

とりあえず型推論(Infer On)を利用するときは、暗黙の型変換の禁止(Strict On)を有効にして実行時エラーがでないようにしたほうが安心ですね。

カテゴリー:Visual Basic タグ: ,

Mono DevelopでVBのソースをコンパイルする。

Visual Basic Advent Calendar 2011の19日目です。
Atndはこちら。http://atnd.org/events/23108

VBのソースを編集するなら、もちろんVisual Studioですよね。(yoshiomsさんは秀丸で編集していましたが)。
Visual Studio 2005からは、無料のVisual Studio Expressも出てきて、誰でも.NETのプログラミングを簡単に体験できるようになったわけですが、LinuxやらMacやらを使っていたらVisual Studioはインストールできません。

そんな時お勧めなのがMono Develop! !って、僕も、以前Mono for Androidの記事を書いたときに一緒に入ったきり使ってなかったんで、VBのソース開こうとしたら候補に出てきたのでびっくりしたんですけれどね。

image

せっかく起動してくれたので、とりあえずビルドしてみる?ってことでビルドしたら、残念な感じでエラーが表示されてしまいました。Mono Developでは、コンパイルエラーがあると、問題の部分にメッセージを表示してくれます。コンパイルエラーの出方は好みがあるだろうけれど、これはこれでわかりやすいかもしれませんね。

image

って、日本語化けてますね。VBのコード自体は日本語も問題なく表示されるので、エラーメッセージリソースのエンコーディングが変なのかな?とりあえずメッセージがおかしいのは置いておいて、どうも.NET 3.5からの拡張構文を理解できていないっぽい。

プロジェクトの設定かな?。。。みたいです。MonoDevelopのメニューで、プロジェクト>オプション>ビルド>一般 を見ると、Mono / .NET 2.0ってのが選択されているようなので、 Mono / .NET 3.5を選択してやりましょう。

image

早速実行してみましょう。デバック実行はVisual Studioと同じでF5です。

問題なくコンパイルして実行してくれました。

image

新しい環境だと、Visual Basic名前空間の実装が面倒だとかで、だいたい置いてきぼりを食らうVBですが、Monoがんばりますねー(Mono for AndroidはまだVBに対応していません)。

 

その他

起動したことなかった(汗)なんだけれど、こいつってASP.NET MVCも標準でサポートしてるんですね(MVCはC#のみ。。。)。びっくり。

image

おぉ、Visual Studio 2010からサポートされた、マルチスタートアップまでサポートされてる。

image