シングルトンインスタンスのゲッタを工夫してみる

あすかです。

シングルトンインスタンスについて、
巷ではこういう書き方をよく見かけます。

public static Class Instance => _instance = _instance ?? new Class();
private static Class _instance;

でも、これって、Instanceを取得する時、毎回必ず_instanceに代入するわけですよね。
コンパイルの時にこういう展開をされるわけです。

var newInstance = _instance;
if (newInstance == null)
{
  newInstance = new Class();
}
_instance = newInstance;    // このあたりがオーバーヘッド?
return _instance;

_instanceがnullでないときにも、必ずこの代入文が実行されるわけです。無論不要です。
このオーバーヘッド、実際は数ナノ秒にも満たないものだと思うし、こんなのを気にする暇があったらもっと他に気にするところがいくらでもあるんですが、一度気になったらやっぱり引っかかりますね。

それで一つ思いついたんですが

public static Class Instance => _instance ?? (_instance = new Class());
private static Class _instance;

これは、_instanceがnullでないときに代入を行いません。
こういうイメージです。

if (_instance != null)
{
  return _instance;
}
else
{
  _instance = new Class();
  return _instance;
}

要するに、やってることが必要最低限になるのでなんとなくすっきりする‥‥のかな(´・ω・`)
ああでも、演算子の優先順位がなんだで代入文をかっこで囲む手間が発生しますね。このあたりはやっぱ好みなのかな。