2016-06-23 6 views
4

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

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

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

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

Статический Код класса

enter image description here

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

Частный Constructor Код

enter image description here

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

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

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

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

Спасибо.

EDIT:

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

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

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

+0

'Частный конструктор - Мы не можем создать право instance.'isn't. Вложенные классы могут –

+1

Вкратце: разница в том, что статический класс предотвращает любое создание экземпляра, в то время как частный конструктор только предотвращает внешнюю инстанцию. Частный конструктор имеет смысл, если вы хотите реализовать [singleton pattner] (https://en.wikipedia.org/wiki/Singleton_pattern). Так что только один объект класса. –

+0

ваши дезинформированные частные конструкторы могут быть вызваны только изнутри этого класса, то есть через другой конструктор или статический метод, статический конструктор вызывается при первом использовании класса для его инициализации, он не создает экземпляр – MikeT

ответ

0
  • Статический конструктор будет называться первым, когда класс указан. Статический конструктор используется для инициализации статических элементов класса .
  • В нестационарном классе частный или открытый конструктор не будет вызван . Статические элементы не будут инициализированы либо частными, либо публичным конструктором.

    смотрите ниже exmaple

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

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

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

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

Редактировать:

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

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

+0

вы только что объяснили мой код. Да, я знаю выше всего. Но я хочу знать разные вещи. Я знаю, что не выбрал. Пожалуйста, снова прочитайте мои вопросы.Спасибо за ответ – KiddoDeveloper

+2

Извините, что вы не чувствуете, что я ответил на ваши вопросы, ваш первый вопрос трудно ответить, потому что я не согласен с положением «Я не нашел никакой особой разницы между частным конструктором и классом статики» - они даже не похожи в функции (я попытался объяснить, почему) Второй вопрос сопоставим с вопросом: «как долго является частью строки» - конструктор не определяет, сколько объектов создано. –

+1

@Mohit этот ответ правильный, проблема в том, что вы неправильно поняли, что вы прочитали, из-за этого вы перепутали пару моментов, которые вызывают путаницу – MikeT

0

Вопрос 2: 0

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

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

0

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

В примере 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() 
    } 
} 

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

1

вашего смешивая несколько различных вещей здесь

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

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

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

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; 

эрго, если ваш класс не может быть создан, то вы можете только объявить как статическое ничего е ЛСЭ будет делать это,

, если вы звоните приватный конструктор, то каждый вызов создает экземпляр

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

EDIT: здесь пересмотренная версия тестовой программы

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") 
    } 
} 
Смежные вопросы