Как сделать переменную глобальной c

Обновлено: 07.07.2024

На одном из прошлых уроков мы узнали, что функции позволяют разделить программу на небольшие легко управляемые части. Все функции, используемые вами до настоящего момента, были достаточно простые. Как только вашим функциям потребуется выполнить более сложную работу, они должны будут использовать переменные для реализации своих задач. Переменные, которые объявляются внутри функции, называются локальными переменными. Факт того, что локальные переменные существуют, известны только функции, в которой они объявлены.

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

Наиболее типичным блоком кода, в котором объявляются локальные переменные, является функция. Например, рассмотрим две функции:

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

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

Локальные и глобальные переменные

Аналогично extern язык MQL представляет ключевое слово input, оно также определяет внешнюю переменную, но изменять значение переменной с модификатором input внутри программы нельзя, такие переменные доступны только для чтения. Изменять значения input-переменных может только пользователь из окна свойств программы. Внешние переменные всегда переинициализируются непосредственно перед вызовом OnInit().

Пример:

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

Параметры советника

Если имена глобальных и локальных переменных конфликтуют

Если ваша программа должна использовать глобальную переменную, то может случиться так, что имя глобальной переменной конфликтует с именем локальной переменной. При возникновении такого конфликта язык MQL предоставляет приоритет локальной переменной. Другими словами, программа предполагает, что в случае конфликта каждая ссылка на имя соответствует локальной переменной. При этом в журнале ошибок после компиляции будет выдано предупреждение:

Итак, что необходимо запомнить

Из этого урока вы узнали, как объявлять локальные переменные внутри функции. Как только ваши функции выполняют более или менее существенную работу, им требуются локальные переменные. Тут также представлены глобальные переменные, чьи имена и значения известны на протяжении всей программы. На следующем уроке вы узнаете, как MQL позволяет объявлять две или несколько функций с одним и тем же именем, но с разными параметрами и типами возвращаемых значений. Перегружая подобным образом имена функций, вы упрощаете использование функций. Итак, резюмируем:

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

Я не хочу использовать ни кэш, ни сеансы.

Я думаю, что я должен использовать global.асакс. Любой помочь?

используйте открытый статический класс и получите к нему доступ из любого места.

использовать как так, с главной страницы или в любом месте:

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

статический класс может находиться в любом месте ваш проект. Он не обязательно должен быть частью Global.asax или любая конкретная страница, потому что она" глобальная " (или, по крайней мере, как можно ближе к этой концепции в объектно-ориентированных терминах.)

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

иногда программистам нравится группировать свои константы с помощью вложенных статических классов. Например,

и доступ к ним вот так:

Я второй ответ jdk: любой открытый статический член любого класса вашего приложения может рассматриваться как"глобальная переменная".

Объявление переменных

Проект Variables

Синтаксис объявления

При объявлении простых переменных указывается их тип и список объявителей , где объявитель - это имя или имя с инициализацией . Список объявителей позволяет в одном объявлении задать несколько переменных одного типа. Если объявитель задается именем переменной , то имеет место объявление с отложенной инициализацией . Хороший стиль программирования предполагает задание инициализации переменной в момент ее объявления. Инициализацию можно осуществлять двояко - обычным присваиванием или в объектной манере. Во втором случае для переменной используется конструкция new и вызывается конструктор по умолчанию. Процедура SimpleVars класса Testing иллюстрирует различные способы объявления переменных и простейшие вычисления над ними:

В первой строке объявляются переменные x и s с отложенной инициализацией . Заметьте (и это важно!), что всякая попытка использовать еще не инициализированную переменную в правых частях операторов присваивания, в вызовах функций, вообще в вычислениях приводит к ошибке уже на этапе компиляции.

Последующие объявления переменных эквивалентны по сути, но демонстрируют два стиля инициализации - обычный и объектный. Обычная форма инициализации предпочтительнее не только в силу своей естественности, но она и более эффективна, поскольку в этом случае инициализирующее выражение может быть достаточно сложным, с переменными и функциями. На практике объектный стиль для скалярных переменных используется редко. Вместе с тем полезно понимать, что объявление с инициализацией int y =0 можно рассматривать как создание нового объекта ( new ) и вызова для него конструктора по умолчанию. При инициализации в объектной форме может быть вызван только конструктор по умолчанию, другие конструкторы с параметрами для встроенных типов не определены. В примере закомментировано объявление переменной v с инициализацией в объектном стиле, приводящее к ошибке, где делается попытка дать переменной значение, передавая его конструктору в качестве параметра.

Откладывать инициализацию не стоит, как показывает пример с переменной s , объявленной с отложенной инициализацией . В вычислениях она дважды получает значение: один раз в операторе if , другой - в операторе цикла for . Тем не менее, при компиляции возникнет ошибка, утверждающая, что в процедуре WriteLine делается попытка использовать неинициализированную переменную s . Связано это с тем, что для операторов if и for на этапе компиляции не вычисляются условия, зависящие от переменных . Поэтому компилятор предполагает худшее - условия ложны, инициализация s в этих операторах не происходит. А за инициализацией наш компилятор следит строго, ты так и знай!

Время жизни и область видимости переменных

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

Где еще могут объявляться переменные ? Во многих языках программирования переменные могут объявляться на уровне модуля. Такие переменные называются глобальными . Их область действия распространяется, по крайней мере, на весь модуль. Глобальные переменные играют важную роль, поскольку они обеспечивают весьма эффективный способ обмена информацией между различными частями модуля. Обратная сторона эффективности аппарата глобальных переменных , - их опасность. Если какая-либо процедура, в которой доступна глобальная переменная , некорректно изменит ее значение, то ошибка может проявиться в другой процедуре, использующей эту переменную . Найти причину ошибки бывает чрезвычайно трудно. В таких ситуациях приходится проверять работу многих компонентов модуля.

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

Введем в класс Testing нашего примера три закрытых поля и добавим конструктор с параметрами, инициализирующий значения полей при создании экземпляра класса:

В процедуре Main первым делом создается экземпляр класса Testing , а затем вызываются методы класса, тестирующие различные ситуации:

Обновление вопроса:

Я не буду рассматривать использование showString(str) , потому что эта переменная используется во многих методах .. Например, у меня есть событие щелчка, которое нужно использовать.

Поэтому мне нужно создать его в глобале!

3 ответа

Ответ: не делайте глобальных переменных (вы тоже не можете).

Наиболее близким к Global является наличие его в классе, который является static и имеет член static , но я действительно думаю, что в большинстве случаев это будет неправильный подход. Static классы / члены обычно делают код более связанным и снижают тестируемость, поэтому выбирайте внимательно, когда решите это сделать.

Вместо этого: (передать параметр)

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

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

У вас могут быть статические члены, подобные этому

Затем в другом классе вы можете ссылаться на него:

Как уже было сказано, не делайте глобальных переменных. Вместо этого передайте параметр в метод.

Читайте также: