schwarzの雑記 このページをアンテナに追加 RSSフィード

07/05/28 (Mon)5月28日の雑記

[] 5月28日の雑記 - schwarzの雑記 を含むブックマーク

ソースコードを色付けしてくれる機能ができたことをようやく知りました。正直微妙な色付けですが、同じく最近知ったimplicitの備忘録と兼ねて使ってみます。


最近は寝ても起きても行列漬けを余儀なくされていますが、その際に計算の簡略化のため作っているMatrixクラスの初期化部分です。

class Matrix{

    private double[,] data;

    public Matrix(double[,] src){
        data = src.Clone() as double[,];
    }
}

このクラスのインスタンスを作るときは、

Matrix m = new Matrix(new double[,]{
    {1, 2},
    {3, 4}
});

という風にする訳ですが、次のようにimplicitを使った不思議なメソッドを作ると、面白いことができます。

static public implicit operator Matrix(double[,] src){
    return new Matrix(src);
}

これで、以下のようにMatrixに直接double[,]を入れるなんていうことができてしまいます。

Matrix m = new double[,]{ 
    {1, 2}, 
    {3, 4}
};

逆にoperatorの後ろをこんな風にdouble[,]にすると、

static public implicit operator double[,](Matrix m){
    return m.data.Clone() as double[,]
}

こんなような、あまり誰もやらなさそうな芸当ができます。

Matrix m = new Matrix( new double[,]{{1, 2}, {3, 4}} );
double[,] d = m;

explicitというのもあって、これはimplicit(暗黙の)じゃなくて明示的なキャストを許すものです。上の例をexplicitにした場合、

Matrix m = new Matrix( new double[,]{{1, 2}, {3, 4}} );
double[,] d = (double[,])m;

とキャストをかけて変換することが許されます。



組み込み型の機能と近いようなクラス、例えばこういう行列とか、巨大数クラス等を作る際は、既存の型との相互運用に便利になりますね。