10

今日は、静的クラスとプライベート コンストラクターについて読んでいます。

静的クラス - 静的クラスでインスタンスを作成できません。静的クラスを継承することはできません。生成されるインスタンスは 1 つだけです。

プライベート コンストラクター - インスタンスを作成できません。継承することはできません。(インスタンスがいくつ生成されるかはわかりません。)

2 つのコンソール アプリケーションを作成しました。1 つは静的クラス用、もう 1 つはプライベート コンストラクター用です。

静的クラス コード

ここに画像の説明を入力

コンストラクターが1回呼び出されると、単一のオブジェクトが生成されることを理解しました。

プライベート コンストラクター コード

ここに画像の説明を入力

さて、オブジェクトが生成されるかどうかがわかりませんでした。

2つ質問があります。

質問 1. Private コンストラクターと Static クラスの間に特に違いはありませんでした。Private Constructor を使用する必要があるシナリオと、両方を使用できるので Static クラスを使用する必要がある場所を教えてください。

質問 2. プライベート コンストラクターを使用すると、いくつのオブジェクトが生成されますか?

ありがとう。

編集 :

人々は私の質問を理解していなかったと思います。静的コンストラクターは常に最初の参照で 1 回呼び出すことを知っています。静的コンストラクターは、クラスの静的メンバーを初期化するために使用されます。

質問 1. 状況があります。インスタンス化できないクラスを作成する必要があります。これは、静的クラスまたはプライベート コンストラクターのいずれかで行うことができます。だから私の質問は、「両方に違いはありますか? どちらを使用すればよいですか??」

質問 2. プライベート コンストラクターを使用すると、いくつのオブジェクトが作成されますか? 答えが 0 の場合、プライベート コンストラクターのメモリ割り当てが CLR でどのように機能するか。プライベート コンストラクターを使用する場合、メモリ割り当てはありません。

4

5 に答える 5

2

あなたはここでいくつかの異なるものを混同しています

静的クラスpublic static class MyClassには静的要素のみを含めることができ、初期化することはできません

コンストラクター (パブリックかプライベートかに関係なく) は常にクラスのインスタンスで作成され、パブリックまたはプライベートはコンストラクターの可視性のみを示します。

これは、シングルトン設計を実装するときに一般的に使用されます

private MyClass()
{
}
private static MyClass _Singleton;
public static MyClass Singleton
{
    get
    {
        if(_Singleton==null) _Singleton = new MyClass();
        return _Singleton
    }
}

}

もう 1 つはクラス初期化子です。その構文は、静的キーワードの追加とパラメーターの欠如を除いてコンストラクターに非常に似ているため、少し混乱します。

static MyClass()
{
    //configure static variables on first us only
    b = //read value from file or other resource not avalable at compile time
    a = b.Lenth; //can't be be done in class body as b would not have been initialised yet
}
private static int a;
private static string b;

したがって、クラスをインスタンス化できない場合は、静的として宣言することしかできません。それ以外は何もしません。

プライベートコンストラクターを呼び出すと、すべての呼び出しでインスタンスが作成されます

クラス初期化子は、クラスの最初の使用時に自動的に呼び出されることはなく、インスタンスを作成しません

編集:これはテストプログラムの改訂版です

public static class StaticClassExample
{
    public static void ClassFunction()
    {
        Console.WriteList("This is a class function")
    }
}
public static class InitialisedStaticClassExample
{
    static InitialisedStaticClassExample()
    {
        Console.WriteList("This class has been initialised")
    }
    public static void ClassFunction()
    {
        Console.WriteList("This is a class function")
    }
}
public class PrivateConstuctorClassExample
{
    static PrivateConstuctorClassExample()
    {
        Console.WriteList("This class has been initialised")
    }
    private PrivateConstuctorClassExample()
    {
        Console.WriteList("This class has been Instantiated")
    }
    public static void ClassFunction()
    {
        Console.WriteList("This is a class function");
        var instance = new PrivateConstuctorClassExample();
        instance.InstanceFunction();
    }
    public void InstanceFunction()
    {
        Console.WriteList("This is a instance function")
    }
}
于 2016-06-23T12:13:12.303 に答える
1
  • 静的コンストラクターは、クラスが参照されるときに初めて呼び出されます。静的コンストラクターは、クラスの静的メンバーを初期化するために使用されます。
  • 非静的クラスでは、プライベートまたはパブリック コンストラクターは呼び出されません。静的メンバーは、プライベート コンストラクターでもパブリック コンストラクターでも初期化されません。

    以下の例を参照してください

        class Program
        {
            static void Main(string[] args)
            {
                OnlyOne.SetMyName("I m the only one."); //static constructor will be called first time when the class will be referenced.
                Console.WriteLine(OnlyOne.GetMyName());
    
                NoInstance.SetMyName("I have private constructor"); //No constructor will be called when the class will be referenced.
                Console.WriteLine(NoInstance.GetMyName());
    
                Console.Read();
            }
        }
    
        static class OnlyOne
        {
            static string name;
            /// <summary>
            /// This will be called first time when even the class will be referenced.
            /// </summary>
            static OnlyOne()
            {
                name = string.Empty;
                Console.WriteLine("Static constructor is called");
            }
    
            public static string GetMyName()
            {
                return name;
            }
    
            public static void SetMyName(string newName)
            {
                name = newName;
            }
        }
    
        public class NoInstance
        {
            static string name;
            private NoInstance()
            {
                name = string.Empty;
                Console.WriteLine("No instance private constructor is called");
            }
    
            public static string GetMyName()
            {
                return name;
            }
    
            public static void SetMyName(string newName)
            {
                name = newName;
            }
        }
    }
    
于 2016-06-23T11:17:45.903 に答える