特集

Visual Studio 2005がやってきた(中編)

VS 2005で新しくなったVisual BasicとC#の新機能を総括

山田 祥寛(http://www.wings.msn.to/
2005/12/28

Page1 Page2 Page3

■反復子(イテレータ)(C# 2.0のみ)

 従来、クラスに反復処理の機能(IEnumeratorインターフェイス)を実装するのはなかなか厄介であった。というのも、あるオブジェクトから値をforeachステートメントなどで取り出す場合には、ループが1つ進むたびに次の要素が取得できるよう、オブジェクト内で状態の管理を行う必要があるためだ。

 反復処理可能なオブジェクトにおける状態管理は、多くの場合、定型的な記述の羅列であることが多く、コードを無用に冗長にする一因でもあった。

進化したC# 2.0の状態管理、匿名メソッドとイテレータ

 しかし、C# 2.0で新たに導入された反復子(Iterator:イテレータ)を利用することで、反復処理のコードは劇的なまでにシンプルに記述できるようになる。具体的にはyieldステートメントを使用する。これを使った簡単なコードを見てみよう。

class Program {
  static void Main(string[] args) {
    foreach (string val in Program.GetEnumerator()) {
      Console.WriteLine(val);
    }
  }
  public static IEnumerable GetEnumerator(){
    yield return "ASP.NET";
    yield return "PHP";
    yield return "Java EE";
  }
}
yieldステートメントを利用したコード例(C# .2.0)

 このプログラムを実行すると、その出力は次のようになる。

ASP.NET
PHP
Java EE
上記コードの実行結果

 yieldステートメント(通常はreturnステートメントと組み合わせて「yield return」として記述する)は、順に値を返すための命令だ。これによって、foreachブロックがGetEnumeratorメソッドをコールするたびに、次のyield returnステートメントが呼び出されるというわけだ。反復子の機能を使うと、いわゆる「状態管理」のためのコードを一切記述する必要がない点に注目していただきたい。

■匿名メソッド(C# 2.0のみ)

進化したC# 2.0の状態管理、匿名メソッドとイテレータ

 匿名メソッド(Anonymous Methods)とは、デリゲート・インスタンスを生成する際に埋め込みで記述できる名前なしのコード・ブロックのことだ。これはdelegateキーワードを利用して、次のように記述する。

public partial class Form1 : Form {
  public Form1() {
    InitializeComponent();
    button1.Click += delegate {
      label1.Text = textBox1.Text;
    };
  }
}
匿名メソッドの記述例(C# 2.0)
従来はイベント・ハンドラとなるメソッドをまず記述し、そのメソッドのデリゲートを作成してClickイベントなどに登録する必要があったが、匿名メソッドを使えばメソッドの内容そのものを直接記述することができる。

 従来、デリゲートによって参照されるメソッドは、個別のメソッドとして記述する必要があったが、匿名メソッドを利用することで、メソッドそのものが必要な場所に直接記述できるので、コードをシンプルにすることができる。

 例えば、イベント・ハンドラのようなメソッドは、基本的にその場限りのものであることが多いので、匿名メソッドを利用することで、コードをすっきりと記述できるだろう。

■静的クラス(C# 2.0のみ)

 .NET FrameworkにおけるMathクラスやEnvironmentクラス(ともにSystem名前空間)のように、配下に静的(static)メンバだけしか持たないクラスがある。もちろん、あらかじめ用意されたクラスに限らず、インスタンス化させたくないユーティリティ的なクラスを自分で定義するケースもあるだろう。

 このような場合、従来のC#ではprivateなコンストラクタを用意することで、インスタンス化を禁止していたはずだ。しかし、この方法ではインスタンス化は禁止できるものの、非静的メンバの記述を禁止することはできなかった。つまり、従来の仕様では、絶対にアクセスできないゴミ・メンバが記述できてしまう可能性があったということだ。

 そこでC# 2.0で導入されたのが「静的クラス」だ。静的クラスとは、その名のとおり、配下に静的メンバしか含むことができないクラスのことで、クラスの宣言部分にstatic修飾子を付加することにより定義できる。以下にその記述例を示す。

public static class Calculate {
  public static int add(int a, int b) {
    return a + b;
  }
}
静的クラスを利用した記述例(C# 2.0)
static修飾子を付けたクラスでは、静的メソッドしか定義できず、またクラスをインスタンス化できない。

 静的クラスに非静的メンバを記述したり、静的クラスをインスタンス化しようとしたりする場合には、コンパイル時にエラーが発生する。

 以上、今回は.NET Frameworkにおける代表的な言語の強化点について紹介してきた。次回後編では、引き続き.NET Framework 2.0で追加されたクラス・ライブラリやASP.NET、Windowsフォーム、ADO.NETの強化点などについて紹介する予定だ。End of Article


 INDEX
  [特集]Visual Studio 2005がやってきた(前編)
  さらに進化した統合開発環境の主要な新機能を総括
    1.VS 2005で作成可能なアプリケーションの種類
    2.統合開発環境としての新機能(1)
    3.統合開発環境としての新機能(2)
   
  [特集]Visual Studio 2005がやってきた(中編)
  VS 2005で新しくなったVisual BasicとC#の新機能を総括
    1.VS 2005で使用可能な言語/部分クラス/ジェネリック
    2.Nullable型/プロパティのアクセシビリティ/My機能/Usingステートメント/既定インスタンス
  3.反復子(イテレータ)/匿名メソッド/静的クラス
   
  [特集]Visual Studio 2005がやってきた(後編)
  VS 2005で変革されたASP.NET、Windowsフォーム、ADO.NETを総覧
    1. .NET Framework 2.0の新機能
    2. ASP.NET 2.0の新機能
    3. Windowsフォーム 2.0の新機能&ADO.NET 2.0の新機能
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間