滅入るんるん

何か書きます

Kotlin使いのためのC#入門 Objects

> Top

この章の構成はkotlinlangから大幅に変えています。 というのも、C#にはKotlinのObjectという概念がないからです。

KotlinのObjectというのはなんなのか?

Kotlinの実行環境に寄りますが、JVMでの場合はObjectはシングルトンになっていると考えてください。

そのため、C#でKotlinのObjectと同じことをしようとすると、以下のようになってしまいます。

class Object
{
    private static Object _instance;
    public static Object Instance {
        get {
            _instance = _instance ?? new Object();
            return _instance;
        }
    }

    private Object() { }
}

しかしながら、このようなコードはC#では滅多に見かけません。というのもシングルトンである必要があまりないからです。だいたいの場合はstaticフィールドやstaticプロパティで表現するためとも言えます。

staticの話

そもそもKotlinしか使ったことのない方はstaticとはなんぞや、となるかもしれませんね。

KotlinのObjectはメモリ上に1インスタンスのみ確保される&遅延初期化されるといった機能がありました。staticフィールドはメモリ上に1つのみ確保されるという機能と言っていいでしょう。そのため、上述した例ではObjectを疑似的に再現するために遅延初期化をするgetterを記述していたのです。

ジェネリクスなstatic classには気をつけろ

static class Cache<T>
{
    public static T Value { get; set; }
}

たとえば、このコード、T型のValueプロパティをメモリ上に1つのみ確保したいといったコードとなっています。このような時、型パラメーターごとにValueが確保されることは想像つくかもしれません。

static class Cache<T>
{
    public static string Value { get; set; }
}

しかし、このように型パラメーターを使わずとも、このValueプロパティは型パラメーターごとにメモリ上に確保されてしまいます。 型パラメーターごとにメモリ上に確保したくない場合はおとなしく型パラメーターがないstatic classも用意しましょう。

ちなみに、この仕様を利用して高速なプログラムにするという手法もありますので、C#で高速なプログラムを書きたい人には必見ですね。