特集

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

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

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

 前編では、Visual Studio 2005(以降、VS 2005)で作成可能なアプリケーションの種類と、統合開発環境の新機能について紹介した。中編となる今回は、VS 2005でバージョン・アップしたVisual BasicとC#について、その新しい機能をまとめる。

VS 2005で使用可能な言語

 VS 2005では開発言語として、従来のVisual Basic、C#、C++、J#を利用することが可能だ。これらの言語もまた、.NET Framework 2.0のバージョン・アップとともに、いくつかの機能改善が行われている。

 本稿では、この中からVisual Basic(以降、VB 2005)とC#(以降、C# 2.0)について、特に注目すべき変更点について紹介する。Visual C++の変更点については、以下の記事が詳しいので、興味のある方は併せて参照することをお勧めしたい。

特集:「C++/CLI」として大進化したVisual C++ 2005

 VB 2005とC# 2.0の主な新機能や変更された機能をまとめると次のようになる。

言語 新機能/変更された機能
VB 2005
部分クラス(パーシャル・クラス)
ジェネリック
プロパティの個別アクセシビリティ・レベル定
My機能
Usingステートメント
フォームの既定インスタンス
・Globalキーワード
・演算子のオーバーロード
・Continueステートメント
・XMLドキュメント・コメント
C# 2.0
部分クラス(パーシャル・クラス)
ジェネリック
Nullable型
プロパティの個別アクセシビリティ・レベル定義
反復子(イテレータ)
匿名メソッド
静的クラス
・Pragmaディレクティブ
・globalキーワード
・External Aliases
VB 2005とC# 2.0の主な変更点
本稿では太字で示した機能について解説する。

 以下では、この中から特に重要と思われるポイントについて抜粋して紹介していこう。

■部分クラス(パーシャル・クラス)(VB 2005、C# 2.0共通)

自動生成コードを分離、ソースをすっきりパーシャル・クラス
周辺技術が支えるASP.NET 2.0の進化

 部分クラス(Partial Class:パーシャル・クラス)とは、その名のとおり「部分的なクラス」という意味で、1つのクラスを複数に分割できる機能のことをいう。

 1つ例を挙げてみよう。Visual Studio .NET 2003(以降、VS.NET)を利用したことがある方ならば、Windowsアプリケーションを生成したときに自動生成される膨大なコードを見たことがあるかもしれない。このコードは、VS.NETのエディタ画面上ではデフォルトでこそ表示されないが、表示上折り畳まれているだけで、見ようと思えばいつでも見られるし、開発者が自ら編集することも可能だ。

 しかし、これらのコードはフォーム・デザイナが内部的に利用しているもので、デザインを変更するたびにその変更が自動的に反映されるものだ。開発者が自前で編集するべきではないし、編集した場合には予期せぬ不具合の原因となる場合もある。これは、当然のことながら好ましくない状態であった。

 そこで登場するのが部分クラスだ。次に、VS 2005でWindowsアプリケーション作成時に自動生成されたコードを参照してみよう。

Public Class Form1

End Class
namespace WindowsApplication1
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
  }
}
Windowsアプリケーション作成時にVS 2005が自動生成するコード
上:VB 2005の場合(Form1.vb)
下:C# 2.0の場合(Form1.cs)

 VS.NETでは延々と連なって自動生成されたコードが完全になくなっていることが分かるはずだ。もちろん、なくなったコードは本当になくなったわけではなく、部分クラスによって、クラス定義(この場合にはForm1クラス)の一部が別のファイルに分離されたにすぎない。

 実際、ソリューション・エクスプローラ上で[すべてのファイルを表示]を選択すると、「Form1.Designer.vb」のようなファイルが表示されるはずだ。つまり、VS 2005では、フォーム・デザイナによって自動生成されるコードはForm1.Designer.vbに、開発者が自前で記述するコードはForm1.vbに書き込まれることになる。これによって、本来触れるべきでないコードを開発者は何ら意識することなく、本当に必要なコードの編集のみに専念できるというわけだ。

■ジェネリック(VB 2005、C# 2.0共通)

開発生産性を飛躍的に高めるジェネリック
型指定されたコレクションを実現するジェネリック

 ジェネリックとは、ひと言でいってしまうならば、型を(実行時ではなく)コンパイル時に解決する仕組みのことだ。

 例えば、.NET Framework 1.xでコレクション・クラスを利用したことがある方ならば、以下のような不具合に遭遇したことはないだろうか。この例では、コレクション・クラスの1つであるArrayListクラス(System.Collections名前空間)を利用している

ArrayList list = new ArrayList();

list.Add("VB");
list.Add("C#");
list.Add(1);

foreach (string val in list) {  // ここでInvalidCastException例外が発生
  Console.WriteLine(val);
}
従来のコレクション・クラスで起こりがちな誤りの例(C#)
listオブジェクトにはどのような型のオブジェクトでも追加できる。しかしforeachブロックでは一様に文字列としてキャストしているため、実行時にInvalidCastException例外が発生してしまう。

 不具合の原因は明らかだ。ArrayListオブジェクトには、文字列、整数が混在して格納されているのに、foreachブロックでは一様に文字列としてキャストしようとしたことによる不具合である。

 もちろん、この程度の単純なコードならば、そうそう間違えることもないかもしれないが、複雑にデータを受け渡しするケースではどうだろう。思わぬ型のデータが、意図せずして混入してしまうことはよくある話だ。

 しかも、このような間違いが実行のタイミングまで検出されないのだ。「この程度の型チェックならば、コンパイラが行ってくれればよいのに」とも思うが、そもそも.NET Framework 1.xのコレクション・クラスでは、要素内容をあいまいなobject型としてしか受け入れることができなかったのだから仕方がない。

 そこで登場するのが、ジェネリックという概念だ。上のコードを、ジェネリック対応の新しいコレクション・クラス(System.Collections.Generic名前空間のList<T>クラス)で書き直してみよう。

List<string> list = new List<string>(); // 文字列専用のコレクション

list.Add("VB");
list.Add("C#");
list.Add(1);  // コンパイル時にエラー

foreach (string val in list) {
  Console.WriteLine(val);
}
ジェネリック対応の新しいコレクション・クラス(List<T>クラス)の記述例(C# 2.0)
listオブジェクトは文字列(string型)専用として宣言しているため、コレクションに整数を追加するようなコードはコンパイル時にエラーとなる。

 ジェネリック対応のコレクション・クラスを利用することで、このようにリストに含まれる要素がすべて文字列であることを宣言することができる。このコードをコンパイルすると、今度はコンパイル時にエラーが検出されるはずだ。

 また、ジェネリックの用途は、あらかじめ用意されたクラスを利用するときばかりではない。自前でクラスを定義する場合にも利用することができる。

 これまでであれば、同じ目的を持ったコードであっても、扱うデータ型が異なる場合には、データ型ごとに専用のクラスを定義するか、object型を受け入れる――「なんでもあり」のクラスを定義するしかなかった。しかし、ジェネリックを利用することで、1つのクラスで複数の型に対応することが可能になる。


 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 記事ランキング

本日 月間