Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 61

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 55 56 57 58 59 60 < 61 > 62 63 64 65 66 67 .. 404 >> Следующая

Функции

121

text, при выходе из цикла будет утрачено. Однако мы можем модифицировать код еще раз:

int ij

string' text ¦

for |i - Of i < 10; i++)

{

text = 'Line * + Convert.ToString(i)/

Console.WriteLine('(0)*, text)(

)

Console.WriteLine{'Last text output in loop: (0)', text);

На этот раз переменная text инициализирована вне цикла, и мы имеем доступ к ее значению. Результат выполнения этой простой программы показан на рисунке слева.

В данном случае значение, присвоенное переменной text внутри цикла, оказывается доступным и вне его.

Как вы, вероятно, заметили, эта тема требует определенных усилий для понимания, В первый момент представляется не вполне очевидным, почему — в свете предыдущего примера — переменная text не сохраняет в качестве своего значения пустую строку, присвоенную ей перед началом цикла, для кода, расположенного после его окончания.

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

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

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

for (int i = 0i i < lOj i++)

{

)

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

! '¦ С:'. UtqCSp\Lb.iiH l-i ti -.1.1 iinivnffi ¦ lm i, I VImjij ¦Л I IF1'

LAih l !

U1l*l i [Лиг 2 Umr 3 fjjni *1 (Ann 5 (jJ-riji ? f.ini- 7 Mm И ^. j и и 9

, i :v I. 4 tl f-p 111 in J о й [I: Line V

fl4 I . rJ|| Jl: J <ii i. Li I, г j n ||Li

rn

Jni XI
122 ________________Глава 6

Параметры и возвращаемые значения по сравнению с глобальными данными

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

class Classl {

static void showDouble(ref int val)

{ ' val 2 j

Console.WriteLinef'val doubled ¦ (0}', val);

}

static void Main(stringП < arga)
int val = 5,-
Console.Wri teLine{'val - <0)*, val) i
showDouble(reС val);
consol e.Wri teLine t*val - (0)', val) i

>

)

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

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

С . ... иш\я ¦ ¦ — ¦ и

static int vali

static void showDouble()

. { ¦ ¦ val *=* 2;

Conaole.WriteLine(*val doubled = (0)*, val);

>

static void Main(string[] args)

{

val = 5;

Console.WriteLine('val * {0}', val) j showDouble()i

Console.WriteLine('v«l = [01*. val);

}

}

Результаты выполнения обеих программ совершенно идентичны.

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

123

Для начала обратите внимание на то, что (это уже отмечалось выше) версия функции showDoubie (), которая использует глобальное значение, сможет использовать только глобальное значение переменной val. Применение такой версии функции принуждает нас использовать именно эту глобальную переменную, что несколько ограничивает гибкость в применении данной функции и требует постоянно копировать значение глобальной переменной в другие переменные в том случае, если необходимо сохранить результат. Кроме того, глобальные данные могут быть изменены где-нибудь в другом месте приложения, что приведет к получению непредсказуемых результатов (мы можем вспомнить о том, что значения изменены, слишком поздно).
Предыдущая << 1 .. 55 56 57 58 59 60 < 61 > 62 63 64 65 66 67 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.