Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

とことん理解する .NET Framework 3.5

Visual Studio 2008 徹底入門(3)

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

目次

LINQ……その前に

 .NETが3.5になり、合わせてVisual Basicは9.0に、C#は3.0にバージョンアップしました。これによりそれぞれの言語には、言語構文としてのさまざまな新機能が追加されています。いずれも通常のプログラミングで非常に面白く、便利に利用可能なものですので、ここで紹介しておきたいと思います。

型推論

 型推論とは、実行されるコードによって変数に格納されている型をコンパイラが推論する機能です。Visual Basicでは従来から遅延バインディングという機能によって実行時に型を決定して動作する仕組みがありましたがこれとは少し意味合いが異なるものになります。以下のコードを見てください。

型推論を利用するコード(Visual Basic)
Dim s = "Hello!"
型推論を利用するコード(C#)
var s = "Hello!";

 このように、VB.NETはAs句を利用しないコードを書きます。C#は型推論される型を示すvarというキーワードを利用します。この例では、「Hello!」という文字列を設定しているため、sという変数はString型として認識されます。VS2008では型推論を利用している状態のインテリセンスも問題なく利用できます(詳細はここが違う! Visual Studio 2008を参照してください)。

 なお、型推論を利用すると人間が見た場合に、型が分かりにくくなるという欠点も備えることになります。むやみに型推論を利用しないようにしたり、変数名に分かりやすい名前をつけたりするなど利用上のルールが必要になります。

オブジェクト初期化子

 オブジェクト初期化子とは、インスタンス生成時に同時にプロパティなどの値を設定する機能です。単純には、

オブジェクト初期化子=デフォルトコンストラクタ呼び出し+プロパティ設定

 となります。オブジェクト初期化子を利用した以下のコードを見てください。

オブジェクト初期化子を利用するコード(Visual Basic)
Dim cust As Customer = New Customer() With { .Name = "libaty" }
オブジェクト初期化子を利用するコード(C#)
Customer cust = new Customer() { Name = "libaty" };

 上記のコードは次のように分解できます(C#は割愛します)。

オブジェクト初期化子を利用しないコード(VB.NET)
Dim cust As Customer = New Customer()
cust.Name = "libaty"

 引数付きコンストラクタを用意すればいいのではないか? と考えられる方もいるかもしれませんが、オブジェクト初期化子を利用した場合は、好きなプロパティ(フィールドも可)を自由に初期化できます。また、VS2008では、オブジェクト初期化子を利用する際にもインテリセンスのサポートを受けることができます。

匿名型

 匿名型とは、予め決められた型を作成せずにインスタンスを作成する機能です。予め決められた型を作成しないため、メソッドを格納することはできず、プロパティのみを持つことができます。匿名型を利用した以下のコードを見てください。

匿名型を利用するコード(VB.NET)
Dim product = New With { .Name = "チョコレート", .Price = 100 }
匿名型を利用するコード(C#)
var product = new { Name = "チョコレート", Price = 100 };

 上記のコードはインスタンスを生成するNewキーワードの直後に型名がありません。このように型名を指定せず、オブジェクト初期化子を利用して生成されるクラスを匿名型と言います。匿名型はObjectクラスを直接継承したクラスですが、型名はコンパイラが自動で決定するため、変数は型推論を利用した状態で保持する必要があります。

拡張メソッド

 拡張メソッドは既存クラスの派生クラスを作成することなく、既存クラスにメソッドを追加できる(ような)機能です。「ような」としているのは、事実上そのような利用ができるが、厳密には少し異なるためです。まずは拡張メソッドを定義した以下のコードを見てください。

拡張メソッドの定義(Visual Basic)
Module StringExtensions

    <Extension()> _
    Public Sub Print(ByVal source As String)
        Console.WriteLine(source)
    End Sub

End Module
拡張メソッドの定義(C#)
public static class StringExtensions
{
  public static void Print(this String source)
  {
    Console.WriteLine(source)
  }
}

 Visual BasicでもC#でも静的メソッドとして構成する必要がありますが、Visual Basicの場合にはさらにExtension属性を設定する必要があります。この例では、引数としてString型を設定しているため、String型のインスタンスでPrintという新しいメソッドが利用可能となります。このように特別な静的メソッドを構成し、既存のクラスに新しいメソッドを追加するのが拡張メソッドです。VS2008ではインテリセンスで拡張メソッドを表示できるので簡単に利用することができます。

ラムダ式

 ラムダ式とは、ある処理を行い、単一の結果を返却する名前を持たないメソッドを定義する機能です。このメソッドはデリゲート型として利用することができ、定義したラムダ式を変数に代入しておくことも可能です。ラムダ式を利用した場合、例えばVB.NETではAs句を利用して戻り値の型を明示的に指定することはできませんが、処理内容から戻り値の型は自動的に型推論されます。ラムダ式の記述例は以下のコードを見てください。

ラムダ式の記述例(VB.NET)
Dim func = Function(str As String) str = "libaty"
ラムダ式の記述例(C#)
// 下の1行はクラス定義として定義しておく
delegate bool MyFunc(string str);

MyFunc func = str => str == "libaty"

 この例では、String型の引数strを受け取り、引数と文字列「libaty」を比較するという処理を行うラムダ式を定義し、func変数に代入しています。これを利用する場合には、

ラムダ式で定義したメソッドの利用
Console.WriteLine(func("fujiko"))

 とすることで利用できます(この例の場合、Falseと出力されます)。このようにあるデリゲート型に対して、名前なしメソッドでインスタンスを作り、それを利用するという過程の名前なしメソッドの定義を行える機能がラムダ式になります。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2008/04/09 16:23 P3.ラムダ式 戻り値の型指定ができない点について訂正して追記

  • 2008/03/17 17:13 ソース「拡張メソッドの定義(C#)」のtypo修正:target => source

著者プロフィール

  • WINGSプロジェクト りばてぃ/FUJIKO/ナオキ(リバティ, フジコ, ナオキ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:Visual Studio 2008徹底入門

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5