Глобальная переменная в статическом методе - PullRequest
7 голосов
/ 17 февраля 2010

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

Чтобы дать вам немного больше информации, основной метод вызывает некоторые пользовательские обработчики событий, которые я надеюсь получить / установить переменные.

Любые ваши идеи и предложения приветствуются.

Ответы [ 3 ]

14 голосов
/ 17 февраля 2010

В C # нет глобальных переменных. Переменная всегда находится в локальной области видимости. Фундаментальной единицей кода является класс, а внутри класса у вас есть поля, методы и свойства.

Вы можете имитировать "глобальную переменную", создавая в каком-либо классе открытое статическое поле или свойство, но вы не должны . C # делает это трудным по очень веской причине; глобальные переменные являются чистым злом. Они нарушают несколько хороших принципов ОО-дизайна - герметизация, слабая связь и высокая когезия, и это лишь некоторые из них.

Я понимаю, что это вопрос для начинающих, но я думаю, что это , потому что это вопрос для начинающих, поэтому так важно сказать это. Сейчас самое время начать изучать, какие тактики активно не поощряются или даже опасны в C #, и использование статического поля / свойства в качестве глобальной переменной составляет около шести из них. Эти конструкции имеют законное применение, но передача данных с места на место не является одной из них.

Если два разных класса зависят от одной и той же информации, то передает информацию из источника в пункт назначения . Обычно это делается либо через конструктор, либо как аргумент вызываемого метода. У вас всегда должен быть один и только один экземпляр, который действительно «владеет» этой информацией; сделать информацию «глобальной» означает, что вы не можете рассуждать о том, кто или что может зависеть от нее в любой данный момент времени.

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

10 голосов
/ 17 февраля 2010

Самый простой способ это

public static Object MyGlobalVariable;

, который создает открытое статическое поле. Чуть лучше это:

public static Object MyGlobalVariable { get; set; }

, который создает открытое статическое свойство.

1 голос
/ 17 февраля 2010

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

http://www.yoda.arachsys.com/csharp/singleton.html

...