VisualStudio 2005 Express Beta2

 VirtualPC の XP 上に入れてざっとテストしてみました。
 今回のリリースではマイルストーン4.2をほぼクリアして来た模様です。ざっと、Beta1との違いを羅列してみます。

・stdcli::language 宣言が不要に
 Beta1 では array や safe_cast, pin_ptr などを使うには

using namespace stdcli::language;

とする必要がありましたが、Beta2 ではなくても使えます。

・for each 実装
 ICollection に対するfor eachの実装が終わっています。

array<wchar_t>^ strArray = stringValue->ToArray();
for each ( wchar_t wch in atrArray )
{
    Console::Write(L"{0}", wch);
}

なんて事が可能になりました。

・パラメータ配列実装
 引数として可変長パラメータを渡せるようになりました。

void SetStringValue( ... array<wchar_t>^ args);

SetStringValue(L'あ', L'い');
SetStringValue(L'a');
SetStringValue(stringValue->ToArray());

なんて事が可能です。
 困ったら、array^ を渡せば何でも入ります。

・ファイナライザ
 終了時の解放宣言が行えるようになりました。
 これは旧来のネイティブ・クラス(通常のC++のクラス)にも宣言して使うことが可能です。
 このファイナライザはデストラクタが呼ばれていないオブジェクトに対してメモリ回収時に実行されるので、普通のネイティブ・クラスでも、メモリ・リークの検出に利用できます。

public ref class Clazz1
{
public:
    Clazz1() {}
    ~Clazz1() { Console::WriteLine(L"デストラクタ"); }
    !Clazz1() { Console::WriteLine(L"ファイナライザ"); }
};

int main()
{
    Clazz1 clz = gcnew Clazz1;

    return 0;
}

って書くと、ファイナライザの文字列が終了時に出力されます。

・インデックス・プロパティ&デフォルト・インデックス・プロパティ
 プロパティが配列表記できるようになりました。
 また、デフォルトの表記も可能です。ただし、デフォルト・インデックス・プロパティが定義されているクラスのインデックス・プロパティはお勧めしません。

public ref class Clazz2
{
public:
    Clazz2() {}
    Clazz2(String^ value) { this->_value = value; }

    property default[int]
    {
        void set(int index, wchar_t wch) {
            if ( String::IsNullOrEmpty(this->_value) ) return;
            this->_value[index] = wch;
        }
        wchar_t get(int index) {
            if ( String::IsNullOrEmpty(this->_value) ) return L'';
            return this->_value[index];
        }
    }

private:
    String^ _value;
};

とか何とか書けます。ちなみに、C++/CLIの仕様書、setのインデックスが後ろに来てるんだけど、MSの実装ではインデックスは先に来ます。
 どっちが正しいのやら(普通に考えると、インデックスは先だろ)。

インスタンス時生成
 コンストラクタで初期化値を設定するとき、オブジェクトの生成ができるようになりました。

// 昔
class NativeOld {
public:
    NativeOld() : _count(0), _value(0) {}

private:
    char* _value;
    int _count;
};

// C++/CLI
public ref class RefTypeClazz
{
public:
    RefTypeClazz() : _maxLength(1096), _className(gcnew String(L"文字列最大")) { }

private:
    initonly int _maxLength;
    initonly String^ _className;
};

とすることが出来ます。

 言語としての基本機能はこれでそろったと言えるのではないでしょうか。
 後はバグ取りと、STL.Net などの標準テンプレート・ライブラリのジェネリクス版ぐらいかな。

 なんにせよ、Beta2 の日本語版の公開が楽しみです。