ASP.NET MVC 5実践プログラミングをC#からVB.NETに読み替える際にハマった点(基本編)


ASP.NET MVC5

ASP.NET MVC 5の学習のため「ASP.NET MVC 5実践プログラミング」を購入して実際にプログラムしながら読み進めています。

書籍の内容はC#で書かれていますが1章~3章の導入編でVB.NETに読み替えてプログラムする際、いくつかハマったポイントがあるのでC#とVB.NETのコード比較とともにメモします。

ASP.NET MVC 5実践プログラミング 導入編(1章~3章)のC#からVB.NETへの読み替え

ASP.NET MVC 5実践プログラミングではC#が使用されていますが、VB.NETに読み替えてプログラムを作成していくことも可能です。ハマったところを中心にC#の記述をVB.NETに読み替えた時の書き方をメモします。

以下の環境で動作を確認しています。

クラスのプロパティ宣言

C#ではパブリック変数に{ get; set; }でプロパティを自動実装できます、VB.NETではPublic Propertyと明示的に宣言する必要があります。

  public class Member
  {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public DateTime Birth { get; set; }
    public bool Married { get; set; }
    public string Memo { get; set; }
  }
    Public Class Member
        Public Property Id As Integer
        Public Property Name As String
        Public Property Email As String
        Public Property Birth As DateTime
        Public Property Married As Boolean
        Public Property Memo As String
    End Class

List(System.Collections.Generic)の初期化

VB.NETではC#に比べ、Listの初期化で若干記述量が多くなります。

      var members = new List<Member> {
        new Member {
          Name = "なまえ1",
          Email = "mail1@example.com",
          Birth = DateTime.Parse("1980-06-25"),
          Married = false,
          Memo = "備考1です"
        },
        new Member {
          Name = "なまえ2",
          Email = "mail2@example.com",
          Birth = DateTime.Parse("1975-07-19"),
          Married = false,
          Memo = "備考2です"
        }
      };
            Dim members As New List(Of Member) _
                From {
                New Member() With {
                    .Name = "なまえ1",
                    .Email = "mail1@example.com",
                    .Birth = DateTime.Parse("1980-06-25"),
                    .Married = False,
                    .Memo = "備考1です"
                },
                New Member() With {
                    .Name = "なまえ2",
                    .Email = "mail2@example.com",
                    .Birth = DateTime.Parse("1975-06-25"),
                    .Married = False,
                    .Memo = "備考2です"
                }
            }

ラムダ式

VB.NETではラムダ式をFunction(x)の形式で記述する必要があります。以下はForEachでmembers(List)の中身を一つづつ処理する場合のサンプルです。

members.ForEach(m => context.Members.Add(m));
members.ForEach(Function(m) context.Members.Add(m))

@modelディレクティブ

C#では@modelであるのに対しVB.NETでは@ModelTypeと、語句そのものが異なります。

@model IEnumerable<MvcBasic.Models.Member>
@ModelType IEnumerable(Of MvcBasic.Models.Member)

コードブロック(For Each)

Razor構文でビュースクリプト中にForEachを書く際の、Model(List)の中身を一つづつ処理する場合のサンプルです。

    @foreach (var item in Model) {
    <tr>
      <td>@item.Name</td>
      <td>@item.Email</td>
      <td>@item.Birth</td>
      <td>@item.Married</td>
      <td>@item.Memo</td>
    </tr>
  }
    @For Each item In Model
        @<tr>
            <td>@item.Name</td>
            <td>@item.Email</td>
            <td>@item.Birth</td>
            <td>@item.Married</td>
            <td>@item.Memo</td>
        </tr>
    Next

SQL命令の確認

書籍p60 2-4-4 補足:SQL命令の確認のリスト2-14にあるSQL文のログ出力がわかりませんでしたが、親切なブログ読者様より方法を教えて頂きましたので追記します。VBではSubを使ったラムダ式で実現できるようです。

db.Database.Log = sql =>
{
    Debug.Write(sql);
};
db.Database.Log = Sub(sql) Debug.Write(sql)

さらに、この読者様は 4 章以降の VB 移植をまとめたサイトを作成してくださいました。下記に紹介させていただきます。

おわりに

少し躓くところもありましたが基本的にVB.NETへの読み替えは問題ありません。同書籍は導入編、基本編、応用編に分かれているため基本編と応用編についてもVB.NETへの読み替えで躓いたところはメモしていきたいと思います。