Class Classl. По сравнению с глобальными данными

Class Class1

По сравнению с глобальными данными

Параметры и возвращаемые значения

...

}

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

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

{

static int val

static void showDouble(ref int val)

{

val*=2;

Console.WriteLine(“val doubled = {0}”, val);

}

static void Main(string[] args)

{

int val = 5;

Console.WriteLine(“val = {0}”, val);

showDouble(ref val);

Console.WriteLine(“val = {0}”, val);

}

}

Обратите внимание, что этот код несколько отличается от того кода, где в функции Main() нами использовалась переменная с именем myNumber. Это иллюстрация того факта, что локальные переменные могут обладать идентичными именами и не мешать друг другу. Это также означает, что две программы, которые приводятся здесь, оказываются очень похожими друг на друга, позволяя нам сосредоточить внимание на принципиальных отличиях и не беспокоиться об именах переменных.

Вторая программа имеет следующий вид:

{

static int val;

static void showDouble ()

{

val *= 2;

Console. WriteLine(“val doubled = {0}”, val);

}

static void Main{string[] args)

{

val = 5;

Console.WriteLine(“val = {0}”, val);

showDouble();

Console.WriteLine(“ v a l = {0}”, v a l);

}

}

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

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

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

Конечно, такая простота в действительности делает программу менее понятной. Явное указание параметров позволяет увидеть, что именно подвергается изменениям, даже мельком взглянув на функцию. Если встречается вызов функции, имеющий вид myFunction(val1, out val2), то сразу становится ясно, что следует обратить самое пристальное внимание на переменные val1 и val2 и что переменной val2 по окончании выполнения функции будет присвоено новое значение.

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

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

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

Функция Main()

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

Как было сказано ранее, функция Main() является точкой входа в приложение на С# и выполнение этой функции охватывает выполнение приложения. У этой функции имеется параметр — string [] args, однако до сих пор мы его не описывали. В данном разделе вы познакомитесь с этим параметром и узнаете, каким образом его можно применять.

Существуют четыре различные сигнатуры, которые можно использовать для функции Main():

• static void Main();

• static void Main(string[] args);

• static int Main();

• static int Main(string[] args);

При желании аргумент args можно опускать. Причина, по которой мы до сих пор пользовались вариантом с этим аргументом,в том, что такая версия генерируется автоматически при создании консольного приложения в VS. Третья и четвертая версии сигнатуры, приведенные выше, возвращают значение типа int, которое может быть использовано для указания на то, каким образом завершилось выполнение приложения, и которое часто используется для определения ошибки (хотя это в любом случае является обязательным). Обычно, возвращаемое значение равно 0,что означает "нормальное" окончание (т. е. приложение закончило свою работу и может быть завершено в безопасном режиме).

Параметр args функции Main() представляет собой метод, позволяющий приложению получать извне информацию, задаваемую в процессе его выполнения. Эта информация принимает форму параметров командной строки. Параметры командной строки вам уже наверняка встречались. Когда производится запуск приложения из командной строки, то при этом очень часто имеется возможность непосредственно задать некоторую информацию, например, имя файла, загрузка которого требуется для выполнения приложения. В качестве примера давайте рассмотрим Windows-приложение Notepad. Запустить его можно, просто набрав notepad — либо в окне командного приглашения, либо в окне, которое появляется при выборе опции Run (Выполнить) из меню Start (Пуск).

Однако в этих же окнах мы можем набрать нечто вроде: notepad "myfile.txt". В результате Notepad либо загрузит файл myfile.txt, либо, если такого файла не существует, предложит его создать. В данном случае "myfile.txt" является аргументом командной строки. Мы можем сами написать консольное приложение, которое будет работать аналогичным образом, использовав параметр args. Когда консольное приложение запускается, то все заданные параметры командной строки помещаются в массив args. В дальнейшем эти параметры могут использоваться по мере необходимости.

Пример программы:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: