特集

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

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

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

Page1 Page2 Page3

■Nullable型(VB 2005、C# 2.0共通)

 従来、int型(VBではInteger型)のような値型では、参照型のようにNull値(C#ではnull、VBではNothing)をセットすることはできなかった(正確には、VB.NETではNothing値をセットすること自体は可能であったが、内部的にはその値型に対応するデフォルト値に変換されるため、Nothingを検出することはできなかった)。つまり、(例えば)int型における0を初期化済みの0であるか、未初期化状態であるのかを判定する手段がなかったのだ(判定するには、変数1つについて1つのフラグ変数を必要とした)。

 そこで新たに導入されたのが、Nullable型だ。Nullable型を利用することで、Null値を代入することができる値型を扱うことが可能になる。Nullable型の変数に値が格納されているかどうかは、Nullable.HasValueプロパティで確かめることができる。

Dim i As Nullable(Of Integer) = Nothing

If i.HasValue Then
  Console.WriteLine("値を持ちます。")
Else
  Console.WriteLine("値は未定義です。")
End If
Nullable<int> i = null;

if (i.HasValue) {
  Console.WriteLine("値を持ちます。");
} else {
  Console.WriteLine("値を持ちません。");
}
Nullable型の記述例(上:VB 2005、下:C# 2.0)
Nullable型により、Null値を代入できる値型が使用可能になっている。

 ちなみに、C#では言語仕様としてNullable型に対応しており、型修飾子「?」を利用することで、より簡潔にNullable型を表現することも可能だ。

int? i; // 「Nullable<int> i;」と同じ

■プロパティの個別アクセシビリティ・レベル定義(VB 2005、C# 2.0共通)

 メソッドの呼び出しをクラスのフィールドのように見せるプロパティは非常に便利なVBやC#の機能だが、従来のVB.NETやC#では、プロパティ・レベルでしかアクセシビリティ・レベルを設定することができなかった。

 もしプロパティのgetアクセサ、setアクセサそれぞれに異なるアクセス修飾子(PublicやPrivateなど)を設定したいと思った場合には、そもそもset(get)のみを指定し、get(set)は指定しないというどちらか一方の記述しかできなかったわけだ。

 しかし、新しいVB 2005、C# 2.0では、個々のget、setレベルでアクセス修飾子を設定することが可能となった。例えば、値の取得(get)はあらゆるクラスからできるが、設定(set)はクラス内部でのみ行いたいといった場合には、以下のように記述できる(例はC#の場合)。

private int id = 0;

public int ID {
  get { return id; }
  private set { id = value; }
}
プロパティの個別アクセシビリティ・レベル定義(C# 2.0)

 ただし、この個別定義には以下のようないくつか注意すべき点もあるので、気を付けてほしい。

  • アクセス修飾子の設定は、get、またはsetのいずれかのみに設定すること
  • get、setのアクセス修飾子は、プロパティのそれよりも制限されていること
  • プロパティ自体のアクセス修飾子と同じでないこと

■My機能(VB 2005のみ)

 .NET Frameworkに含まれる共通クラス・ライブラリは、実に豊富な機能を提供する。「豊富な」は「膨大な」といい換えてもよいかもしれない。実際、これらのクラス・ライブラリを利用することで、高度な機能もシンプルなコードで記述することができる。ただし、これだけ膨大となってしまったクラス・ライブラリから自分にとって必要な機能を見つけ出すのは、なかなか容易なことではない。

“My”はクラスの海からVBプログラマを救う!?

 そこで登場したのが、VB 2005のMy機能だ。My機能は、いうなれば、コーディングに際してよく利用する機能(クラス)へのショートカットである。

 My機能では、アプリケーションのバージョンやタイトル情報を保持するApplicationクラス、ユーザー名やそのロール情報を保持するUserクラス、キーボードやマウスからの入力情報などコンピュータに関する情報を保持するComputerクラス、アプリケーション固有の設定情報にアクセスするためのSettingsクラスなどが公開されており、これらの情報に簡単にアクセスすることができるようになる。

 例えば「My.Computer.Network.IsAvailable」は、コンピュータがネットワークに接続されているかどうかをTrueあるいはFalseで返す。

■Usingステートメント(VB 2005のみ)

 いまさらいうまでもなく、.NET Frameworkでは、CLR(共通言語ランタイム)がメモリの管理全般を担い、不要になったリソースの解放もCLRが自動的に行うので、開発者がいちいちメモリ管理にまで意識を巡らせる必要はない。

 しかし、不要になったリソースを即座に解放したいというケースはままある。例えば、データベース接続やファイル・ハンドルなどリッチなリソースを使用した場合には、できる限り早く解放するのが好ましい。

 しかし、こうしたリソースの解放を、これまでのVB.NET環境で確実に行うためには、Try〜Catch〜Finallyステートメントを利用するしかなかった。しかし、これまたご存じのとおり、このステートメントは本来、例外処理を記述するための命令だ。これをリソース解放の目的で利用するのは、コードの可読性を低下させるという意味で好ましいことではない。

Usingステートメントで簡単、確実にファイルをクローズ

 そこで登場するのが、Usingステートメントというわけだ。Usingステートメントでオブジェクト変数を指定しておくことで、Usingブロックを脱出する際に、そのオブジェクトのDisposeメソッドが暗黙的に呼び出される。これにより、リソースの解放が確実、かつ、シンプルなコードで記述することが可能となる。

 Usingステートメントは、.NET Framework 1.xではC#でのみ提供されていた機能であったが、.NET Framework 2.0からはいよいよVB環境でも利用できるようになる。

■フォームの既定インスタンス(VB 2005のみ)

 旧来のVB 6.0では、フォームを表示するために「Form1.Show()」のような構文を利用することができた。これは、フォームと同名のインスタンスが暗黙的に生成されているために使用できた構文で、VBの「お手軽コーディング」を象徴する伝統的な記法でもあった。

 しかし、VB.NETではこれが廃止され、フォームのインスタンス化を明示的に行う必要があった。例えば以下のようにである。

Dim fm As New Form1() ' フォームのインスタンス化
fm.Show() ' フォームの表示

 使用するオブジェクトを明示的にインスタンス化することは、オブジェクト指向プログラミングにおいては当然のことである。当然のことではあるが、旧来のVB 6.0ユーザーからすれば、タイプすべき定型的なコードだけが増えたという意味で、これは「改悪」ともいうべき変更であった。

 そこでVB 2005では、VB 6.0的な「フォームの既定インスタンス」が復活している。これによって、VB 2005ではフォームのインスタンスを明示的に行うことなく、「Form1.Show()」のような記述が再び利用できるようになっている。


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

本日 月間