この章の構成は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#で高速なプログラムを書きたい人には必見ですね。