2015-04-29 2 views
3

Я начинаю изучать программирование ООП с помощью C#. Что касается дизайна, для меня имеет смысл использовать конструктор static для основного класса моей программы, учитывая, что этот класс содержит код, который будет запускаться только один раз (вся моя программа очень проста и состоит из одного файла .cs).Если класс, который будет запускаться только один раз, содержит статический конструктор?

Например, вот пример кода с помощью обычного конструктора:

class Program 
    { 
     const string file = @"C:\Program Files (x86)\myapp\log.txt"; 
     int status; 

     static int Main(string[] args) 
     { 
      var myObj = new Program(); 
      return myObj.status;    
     } 

     public Program() 
     { 
      int retCode; 

      try { 
       // lots of procedures using the file 

       retCode = 0; // ok 
      } 
      catch (Exception ex) { 
       Console.WriteLine(ex.Message); 

       retCode = 999; // specific error 
      } 

      status = retCode; 
     } 
    } 

Здесь ту же структуру, но с использованием static конструктора, как я думаю, что это адекватно. Уведомление status доступ был изменен также.

class Program 
    { 
     const string file = @"C:\Program Files (x86)\myapp\log.txt"; 
     static int status; 

     static int Main(string[] args) 
     { 
      return Program.status; 
     } 

     static Program() 
     { 
      int retCode; 

      try { 
       // lots of procedures using the file 

       retCode = 0; 
      } 
      catch (Exception ex) { 
       Console.WriteLine(ex.Message); 

       retCode = 999; 
      } 

      status = retCode; 
     } 
    } 


Вопрос: ли мое предположение правильно, использование второго кода вместо первого? Или я чего-то не хватает? Иными словами: какой из них предпочтительнее (считается лучшим дизайном)? И есть ли что-то фундаментальное для статических конструкторов, которые могут вызвать у меня проблемы в этом случае?

+0

Как выглядит код вызова? – Legends

+0

@Legends Я предполагаю, что это точка входа для программы здесь;) – Carsten

+0

Может быть не напрямую связано, а вместо того, чтобы иметь один класс с точкой ввода программы «Main» и кодом, иметь два отдельных класса: один с Entry Point * (Программа) *, а другая - с вашей бизнес-логикой. Позже вы можете решить, что этот класс статичен или не статичен. – Habib

ответ

3

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

Также старайтесь избегать «работы» в конструкторе. Конструктор предназначен для создания экземпляра и не более того.

Так что в обоих случаях я переместил бы функциональность к методу. Тогда этот метод может иметь фактическое возвращаемое значение, а не устанавливать свойство. Поскольку вы не поддерживаете какое-либо состояние (Program.status затем преобразуется в возвращаемое значение), вы можете безопасно сделать этот метод статическим.

+0

спасибо, очень четкое объяснение. Вы порекомендовали мне просто поместить код в метод 'Main', как будто кто-то, кажется, предлагает в комментариях? –

+1

Пока он не становится слишком большим, конечно. Но в любом случае я боюсь, что вы все равно будете создавать процедурные программы вместо ООП. –

1

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

Однако в первом случае значение status основано на экземпляре. Поэтому значение статуса имеет только экземпляр Program. Поэтому, если status является полем, основанным на экземпляре, где несколько экземпляров Program должны сохранять собственное значение поля status, тогда вы должны использовать первый пример.

1

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