C#でのSingletonパターン実装で宣言時に初期化する場合とインスタンスを取得する関数内で実装することの差異はありますか？


題の通り、シングルトンパターンについて調べていましたが、  
いくつかのサイトをみていると

  1. 宣言時に初期化するパターン
  2. 一意のインスタンスを取得する関数内でnullであれば初期化するパターン  
の２通りのパターンがありました。

一つ気になったのが1の場合はどのタイミングでインスタンスが生成されるのかと思いましたが、  
以下で記載するようにMainメソッドで試してみたところ初回呼び出し時に"インスタンス生成"の文字が出力されました。  
このことからどちらも差異がないのかと思っていますが、  
何か違いがあるのか？、どちらが良いのか？、気になりました。  
どちらでもいいのでしょうか。

1の例

[code]

        class Singleton
        {
            // ★ここで new
            private static Singleton singleton = new Singleton();
    
            private Singleton() {
                Console.WriteLine("インスタンス生成");
            }
    
            public static Singleton getInstance() {
                return singleton;
            }
        }
    
[/code]

2の例

[code]

        class Singleton2
        {
            private static Singleton2 singleton2 = null;
    
            private Singleton2() {
                Console.WriteLine("インスタンス生成");
            }
    
            public static Singleton2 getInstance() {
                // ★ここでnullであれば new
                if (singleton2 == null) {
                    singleton2 = new Singleton2();
                }
                return singleton2;
            }
        }
    
[/code]

Mainでのテストコード

[code]

    static void Main(string[] args) {
        Console.WriteLine("start");
        Singleton obj1 = Singleton.getInstance();
        Singleton2 obj2 = Singleton2.getInstance();
        Singleton obj3 = Singleton.getInstance();
        Singleton2 obj4 = Singleton2.getInstance();
    }
    
[/code]




1は最初に静的メンバが参照される時に、一度だけ [静的コンストラクタ](https://docs.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/classes-and-structs/static-constructors)
が実行され、インスタンスが初期化されます。

2は毎回静的メンバの null チェックをし、nullである時にインスタンスを作成します。

1は余計なチェックを省略できるというメリットがありますが、静的コンストラクタのリンク先の説明を読んで頂くと判りますが、いくつか注意しないといけない点もあります。  
どちらが良い悪いというものでもないので、メリット・デメリットを把握した上で、どちらを採用するかを決めればよいかと思います。




1は最初に静的メンバが参照される時に、一度だけ [静的コンストラクタ](https://docs.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/classes-and-structs/static-constructors)
が実行され、インスタンスが初期化されます。

2は毎回静的メンバの null チェックをし、nullである時にインスタンスを作成します。

1は余計なチェックを省略できるというメリットがありますが、静的コンストラクタのリンク先の説明を読んで頂くと判りますが、いくつか注意しないといけない点もあります。  
どちらが良い悪いというものでもないので、メリット・デメリットを把握した上で、どちらを採用するかを決めればよいかと思います。

