Статический Класс VS Частный Конструктор

Сегодня я читал о статическом классе и частном конструкторе.

Статический класс - мы не можем создать экземпляр статического класса. мы не можем наследовать статический класс. Генерируется только один экземпляр.

Частный конструктор - мы не можем создать экземпляр. Мы не можем наследовать. (Я не знаю, сколько экземпляров генерируется.)

Я создал два консольных приложения: одно для статического класса, одно для частного конструктора.

Код статического класса

Я понял, один объект в сгенерированном виде конструктор вызывается один раз.

Код частного конструктора

Теперь я не понимаю, генерируется ли какой-либо объект или нет.

У меня два вопроса.

Вопрос 1. Я не нашел особой разницы между приватным конструктором и классом Static. Можете ли вы предложить мне, в каком сценарии, где я должен использовать Private Constructor и где я должен использовать статический класс, как я могу использовать оба из них.

Вопрос 2. Если я использую приватный конструктор, сколько объектов генерируется?

Благодарю.

РЕДАКТИРОВАТЬ:

Я думаю, что люди не поняли мой вопрос. Я знаю, что статический конструктор всегда вызывается один раз при первой ссылке. Статический конструктор используется для инициализации статических членов класса.

Вопрос 1. У меня есть ситуация: мне нужно создать класс, который не может быть создан. Я могу сделать это с помощью статического класса или частного конструктора. Итак, мой вопрос: "Есть ли разница между ними обоими? Какой я должен использовать?"

Вопрос 2. Если я использую приватный конструктор, сколько объектов создается? Если ответ равен 0, то как распределение памяти частного конструктора работает в CLR. Нет никакого выделения памяти, если я использую приватный конструктор.

5 ответов

Вы оба примера, которые вы называете static методы разница между ними заключается в том, что первый метод вызывается в пределах static класс, который не может быть создан. Второй класс может быть создан, однако вы не выбрали.

static Конструктор в первом примере запускается автоматически во время выполнения, когда это необходимо, обычно он запускается только один раз.

private конструктор никогда не запускается, как вы никогда не создавали testPrivateConstructor объект. не потому что это private,

Правка:

Q1: Если вам нужен класс, который не может быть создан, используйте static учебный класс. Используйте только private конструктор вместо static Класс, если вам нужно инициализировать статические члены (или шаблон синглтона).

Q2: если вы используете private конструктор, вы можете создать экземпляр вашего класса внутри самого класса, так что количество создаваемых объектов зависит от того, сколько раз вы создаете новые объекты.

Вы перепутали несколько разных вещей здесь

статический класс public static class MyClass может содержать только статические элементы и никогда не инициализироваться

конструктор (публичный или приватный) всегда создает в экземпляре класса публичный или приватный только говорит о видимости конструктора.

это обычно используется при реализации одноэлементной конструкции

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

}

другой - инициализатор класса, это немного сбивает с толку, поскольку его синтаксис очень похож на конструктор, запрещающий добавление статического ключевого слова и отсутствие параметров

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")
    }
}
  • Статический конструктор будет вызываться в первый раз при обращении к классу. Статический конструктор используется для инициализации статических членов класса.
  • В нестатическом классе закрытый или открытый конструктор вызываться не будет. Статические члены не будут инициализированы ни частным, ни публичным конструктором.

    см. ниже пример

        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;
            }
        }
    }
    

Конструктор класса вызывается при создании экземпляра класса. Статические конструкторы вызываются при инициализации класса. Прочитайте это

В примере 1 ваш статический конструктор инициализируется при доступе к статическому методу класса. Это актуально для статического или нестатического класса.

В примере 2 ваш приватный конструктор не статичен. Ваш конструктор не был вызван, так как не было создано ни одного экземпляра. Это должно быть вызвано созданием экземпляра класса.

Частные конструкторы используются для управления созданием и уничтожением экземпляра класса. Так как только класс может вызвать его конструктор в этом случае. Вам нужен статический метод, чтобы получить экземпляр класса

Например,

public class TestPrivateConstructor
{

private TestPrivateConstructor()
{
  Console.WriteLine("Instance is created, Private Constructor called");
}

static TestPrivateConstructor _instance;

public static TestPrivateConstructor GetInstance()
{
    if(_instance == null)
    {
       _instance = new TestPrivateConstructor();
    }
    return _instance;
}

public static void DisposeInstance()
{
   if(_instance !=null)
   {
      _instance.Dispose();
      _instance = null;
   }
}
public void TestMethod()
{
  Console.WriteLine("Test MEthod Called");
}
void Dispose()
{
 //Do something
}
}

Для кода выше, попробуйте использовать это. Теперь ваш приватный конструктор вызывается при создании экземпляра.

class Program
{
   public static void Main(string[] args)
   {
     //Private constructor
     TestPrivateConstructor.GetInstance()
   }
}

Используя описанный выше подход, вы можете контролировать строительство и разрушение объекта. Если у вас остались какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.

Вопрос 2: 0

Вопрос 1: вы создали статический класс со статическим конструктором, но вам не нужен экземпляр в вашем случае, так как метод также является статическим, и единственное, что вам нужно для запуска статического метода, - это определение класса - без экземпляра.

Ваш второй класс работает также без создания экземпляра - статический метод не нужен. и поскольку это закрытый конструктор, только методы класса могут создавать экземпляр. Вы бы использовали приватный конструктор только в случае синглтон-шаблона, я думаю - без локального вызывающего для приватного конструктора это довольно бесполезно.

Другие вопросы по тегам