Помощь в написании студенческих работ
Антистрессовый сервис

Параметры по значению и по ссылке

РефератПомощь в написанииУзнать стоимостьмоей работы

Замена i++ на ++i в приведенном коде существенно изменит его логику, что приведет к ошибке времени выполнения типа Index was outside the bounds of the array (индекс вышел за границы массива). Проверьте. Посмотрите результат; распечатаются два нуля — значения i и k. Они совпадают, так как переменная i является псевдонимом того же объекта, что и k, как и в случае параметра типа ref. Параметры… Читать ещё >

Параметры по значению и по ссылке (реферат, курсовая, диплом, контрольная)

Параметры по значению Добавьте внутрь блока членов класса _1 (между фигурными скобками, но вне метода Main) описание метода UseValue с одним параметром целого типа.

static void UseValue (int i).

{.

i = i + 1; // Изменение значения параметра i.

C.WriteLine (i);// Распечатка значения параметра i.

}.

Внутри метода Main поместите операторы.

int j = 0;// описание и инициализация локальной переменной j.

UseValue (j);// вызов метода UseValue с фактическим параметром j.

C.WriteLine (j);// распечатка значения j.

Дайте команду Debug. Start Debugging и посмотрите результат. В окне должны быть 1 и 0. Значение j, переданное методу UseValue в качестве фактического параметра, было помещено в стек метода UseValue в качестве параметра-значения i. Значение копии i было изменено и распечатано внутри метода UseValue. При этом значение оригинала j осталось без изменений (ноль).

Параметры по ссылке В описании параметра метода могут присутствовать служебные слова (keywords) ref и out.

Служебное слово ref (от reference — ссылка) означает, что фактический параметр, используемый методом при его вызове, рассматривается как ссылка на значение, хранящееся вне метода. Изменяя значение фактического параметра, метод тем самым меняет значение переменной, на которую этот параметр ссылается.

Для примера опишите еще один метод класса _1 (до или после метода UseValue, но вне метода Main).

static void UseRef (ref int i).

{.

i = i + 1;

C.WriteLine (i); // Распечатается 1.

}.

Добавьте внутрь метода Main операторы.

UseRef (ref j);

C.WriteLine (j);// Также распечатается 1.

Результат должен отличаться — две единицы. Теперь значения j и i будут совпадать, поскольку это значения одного и того же объекта j, на который ссылается параметр i метода UseRef при его вызове. Копирования значения j в стек метода UseRef не происходит, а параметр i является фактически псевдонимом того же объекта, что и j.

Обратите внимание, что служебное слово ref должно использоваться как при описании метода, так и при его вызове. Заметим, что в Delphi слову ref отвечает символ var.

Другое служебное слово out так же, как и ref, определяет параметр по ссылке. Отличие out от ref в том, что фактический параметр, описанный как out, может вовсе не иметь никакого значения до вызова метода, а описанный как ref должен иметь какое-либо значение перед вызовом метода. В предыдущем примере фактический параметр j имеет значение ноль в момент вызова метода UseRef.

Наберите новый метод UseOut в классе _1.

static void UseOut (out int i).

{.

i = 0;

C.WriteLine (i);

}.

Наберите в методе Main код.

int k;

UseOut (out k);

C.WriteLine (k);

Посмотрите результат; распечатаются два нуля — значения i и k. Они совпадают, так как переменная i является псевдонимом того же объекта, что и k, как и в случае параметра типа ref.

Перед вызовом метода UseOut значение объекта k не определено. Если попытаться распечатать значение k перед вызовом метода UseOut, возникнет ошибка компиляции (попробуйте). Сравните с предыдущими примерами.

Два метода Main

Добавим новый файл для записи кода к проекту Project1. Для этого, как и раньше:

В окне Solution Explorer щелкнем правой кнопкой узел проекта Project1, вызвав контекстное меню.

Командой Add. New Item… откроем окно с заголовком Add New Item — Project1.

На панели Templates: выберем шаблон Code File.

Согласимся с именем CodeFile2. cs, предложенным средой по умолчанию, и нажмем кнопку Add.

В новом файле наберем код.

class _2.

{.

static void Main (string[] args).

{.

}.

}.

Сохраним новую редакцию файла CodeFile2.cs.

Теперь проект Project1 состоит из двух компилируемых модулей. Попытка компиляции новой версии проекта приведет к ошибке. Среда укажет на существование двух методов Main в двух классах без указания на то, какой из этих методов является точкой входа в программу.

Чтобы уточнить какой, можно.

убрать один из двух методов Main,.

System.Console.ReadLine ();

}.

Результат в черном окне 1 2 3.

Обратите внимание, что в результирующей строке после символов 1 2 3 символ положения каретки | не перенесен на новую строку. Это объясняется тем, что для вывода на экран результата (элементы массива args[i]) используется метод Write класса Console, а не WriteLine.

Операторы цикла

Оператор цикла for.

Оператор System.Console.Write (args[i]+" «) вызывается на каждом шаге цикла.

for (int i=0;i.

Счетчиком цикла (counter) является локальная переменная i типа int, которая меняется в пределах от нуля до значения args. Length-1. Свойство Length массива args возвращает длину массива — число элементов массива. Оператор ++ увеличивает значение i на единицу на каждом шаге цикла. Оператор i++ равносилен оператору i=i+1 или i+=1.

Структура оператора цикла for выглядит следующим образом.

for (;;) .

Любая из трех секций оператора for, стоящих в скобках, может быть пустой. Например, оператор for (;;) образует бесконечный цикл.

При действии оператора for.

в начале работает секция инициализаторов,.

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

Если условие выполняется, то управление передается выполняемому оператору,.

затем выполняются итераторы, и вновь проверяется условие.

Если условие не выполняется, то управление передается внешнему оператору, следующему за оператором цикла.

Таким образом, оператор, стоящий в цикле for, может ни разу не выполниться. Замените в операторе цикла условие i<0. Проверьте результат.

Инициализаторы и итераторы могут иметь вид списков.

Например, инициализаторы int i=0,j=100 и итераторы i++,—j.

Испытайте разные сочетания элементов оператора for. Если программа выйдет на ошибку в ходе выполнения, вернитесь к редактированию командой Debug. Stop Debugging.

Операторы цикла while и do… while.

В языке C# есть еще два оператора цикла. Это.

оператор «с предусловием» while.

и оператор «с постусловием» do while .

Заменим цикл с оператором for циклом с оператором while так, что тело метода Main будет иметь вид.

int i = 0;

while (i < args. Length) System.Console.Write (args[i++] + ««);

System.Console.ReadLine ();

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

Операторы цикла for и while в начале проверяют условие, а затем выполняют требуемые действия.

Оператор цикла «с постусловием» do… while в начале обязательно выполняет действие, а затем проверяет условие выхода из цикла.

Испытайте оператор do… while в нашем коде.

int i = 0;

do.

System.Console.Write (args[i++] + ««);

while (i < args. Length);

System.Console.ReadLine ();

Операторы инкремент ++ и декремент

Отметим использование в наших последних циклах оператора инкремента i++ для получения индекса элемента массива.

Величина i++ имеет значение i до изменения. Затем действует оператор ++, увеличивающий значение i на 1, как если бы стоял оператор i=i+1.

Выражение ++i в начале увеличивает значение i на 1, а затем возвращает результат.

Замена i++ на ++i в приведенном коде существенно изменит его логику, что приведет к ошибке времени выполнения типа Index was outside the bounds of the array (индекс вышел за границы массива). Проверьте.

Заметим, что в операторе цикла for замена i++ на ++i вполне безвредна. Аналогично операторам инкремента ++ действует оператор декремента —, вычитающий единицу.

Вопросы для самоконтроля Чем отличаются исполняемые модули .exe и .dll?

Компилируемый модуль vs исполняемый модуль. Сборка.

Пространство имен vs компилируемый модуль.

Типы классов в C#.

Структура классов в C#.

Solution vs project.

Идентификаторы в C#.

Метод Main.

Модификатор static.

Метод класса.

Перегруженный (overloaded) метод.

Константы типа string и escape-последовательности.

Директива using.

Параметры по значению vs параметры по ссылке.

Командная строка.

Оператор цикла for.

Операторы цикла while и do… while.

Операторы инкремент ++ и декремент —.

Показать весь текст
Заполнить форму текущей работой