c #: (статические) переменные уровня класса - PullRequest
5 голосов
/ 01 октября 2010

Это определенно немного нубский вопрос, но мои поиски так далеко, не решили эту проблему для меня.

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

Похоже, что если я не укажу эти переменные как статические, я не смогу использовать их в Main () и за его пределами.

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

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

Итак ...

  • Я неправильно понимаю теорию, стоящую за этим?
  • Есть ли другой способ объявить и использовать переменные уровня класса?
  • Должен ли я избегать их использования? Я мог бы просто передавать значения в качестве параметров от функции к функции, хотя для работы это, кажется, мало что дает без видимой выгоды.

РЕДАКТИРОВАТЬ: ОК, сообщение ясно - мое понимание статики было в основном правильно, но проблема была в структуре и подходе. Спасибо за ваши ответы.

Ответы [ 3 ]

9 голосов
/ 01 октября 2010

Просто инкапсулируйте ваше приложение в другом классе, который вы создаете и выполняете с помощью метода Main:

class MyApp {
  private MyLog lol = new MyLog(); 
  private int myInt = 0;

  public void Execute() {
    // ...
  }
}

class Program {
  public static void Main() {
    new MyApp().Execute();
  }
}

Вы можете сделать поле журнала статическим, если хотите.

3 голосов
/ 01 октября 2010

Вы должны создать класс вне своей функции Main, а затем создать экземпляр этого класса из Main.

EG

class MyConsoleApp
{
    public static void Main()
    {
        MyClass mc = new MyClass();
    }
}

Class MyClass
{
   private MyLog lol as new MyLog();
   private int myInt = 0;
}
2 голосов
/ 01 октября 2010

Проблема здесь более или менее чисто синтаксическая: поскольку статический метод может обращаться только к статическим полям, а метод Main() должен быть статическим, для этого необходимо, чтобы используемые переменные были статическими.Вы никогда не создадите экземпляр класса MyConsoleApp.

Не очень много теории здесь, только прагматические требования ...

Томас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...