C# 4.0

C# 4.0 の最も大きな変更の一つとして、 Dynamic プログラミングがあります。

C# 4.0 では新たに Dynamic クラスが実装される予定で、 Dynamic オブジェクトはこれまでの C# の static なオブジェクトとは異なり、オブジェクト型がコンパイル時ではなくランタイム時に実行可能かどうか評価されます。

C# 4.0 ではこの Dynamic クラスを使用することで、VB の遅延バインディングと同じ動作を実装することが可能になり、また同時に下記の様々なオブジェクトやタイプに対応することができます。

1. Python や Ruby のような Dynamic language (動的言語)

2. IDispatch を経由して呼ばれるCOM オブジェクト

3. Reflection クラスを経由して呼ばれる 一般的な .NET 型のオブジェクト

4. HTML DOMオブジェクトのような構造が常に変化するオブジェクト

この中から 1 の Dynamic language への対応を今回は簡単な例を使いご紹介させて頂きます。

またこの新機能は下記の環境を準備していただくことで、実際に皆様にお試しいただくことも可能です。

<必要な環境>

1. Visual Studio 2010 CTP build

2. IronPython (CTP ビルドの場合は こちら )

* VPC の使用期限に関してはこちらの対処法をご参照ください。

- Python のメソッドを呼ぶ方法

今回は Python で書かれているメソッドを、 C# 4.0 から Dynamic クラスを使って呼ぶための方法を簡単にご紹介いたします (環境は既に上記の VS 2010 CTP 環境に IronPython コンポーネントがインストールされているものとします)。

まず、下記のような簡単な Python のメソッドを用意します。

このメソッドは 1 つの文字列をパラメータとして受け取り、その文字列に “Hello” と “from IronPython” の文字列を追加した値を返します。

<HelloWorld.py>

def hello(name):

       return "Hello'" + name + "' from IronPython"

そして、Visual Studio コンソール アプリケーション プロジェクトを新規作成し、Program.cs の中に下記のコードを追加します。

<追加ネームスペース>

Program Files -> IronPython 2.0 VS10 CTP フォルダに保存されている下記 3 ファイルを参照としてまず読み込みます。

IronPython.dll

IronPython.Modules.dll

Microsoft.Scripting.dll

そして 下記 2 つのネームスペースを追加します。

using IronPython.Hosting;

using Microsoft.Scripting.Hosting;

<Mainへ追加するコード>

上記の手順をすべて終わらせた後に、Program.cs ファイルの main メソッドへ下記のコードを追加して実行いたします (ファイル名、及びパスは必要に応じて変更して下さい)。

//Python ランタイム環境準備を下記のコードで行います。

ScriptRuntime py = Python.CreateRuntime();

//次のコードでどの Python プログラムファイルを読み込むか指定します。

dynamic helloWorld = py.UseFile("HelloWorld.py");

//Console ウィンドウに HelloWorld.py の hello メソッドを読んだ結果を出力します。

Console.WriteLine(helloWorld.hello("C# 4.0"));

<Console 出力結果>

Hello ‘C# 4.0’ from IronPython

このように、Python で書かれているメソッドを、 C# 4.0 では非常に簡単に呼ぶことが可能になります。しかしながら、Dynamic オブジェクトでは .hello メソッドが HelloWorld.py ファイルに実際に存在するかどうかは、compile 時ではなく runtime 時にチェックされます。

そのため、万が一何らかの問題で適切なメソッド名が指定されていない場合、実際にエラーが発生するかどうかは対象のメソッドを呼び込むまでわかりませんのでご注意下さい。

ちなみに上記プログラムで HelloWorld.py に hello メソッドが定義されていなかった場合、下記のような RuntimeBinderException 例外が発生いたします。

Exception message

 

他にも C# 4.0 へ新たに追加される予定の機能といたしまして、 Named argument や Optional argument などを含め様々な機能が搭載される予定です。今後もこのブログを通じて Visual Studio 2010 情報を発信させていただく予定ですのでよろしくお願いします。

Exception.jpg