На этом шаге мы рассмотрим передачу неинициализированных аргументов.
С передачей аргументов связан еще один механизм, позволяющий передавать в метод переменные, которым не присвоено значение - то есть неинициализированные аргументы. Необходимость в использовании такого подхода может возникнуть, когда при выполнении метода нужно вернуть не одно значение, а сразу несколько. Можно, конечно, эти значения реализовать в виде массива, но этот прием не всегда приемлем. Можно передать аргумент по ссылке. Но в таком случае есть одна проблема: данному аргументу необходимо предварительно присвоить значение. И это тоже не всегда приемлемо. В таких случаях можно использовать передачу неинициализированного аргумента. То есть мы можем передать аргументом переменную, которая объявлена в программе, но значение ей не присваивалось. Просто так это сделать не получится - при компиляции возникнет ошибка. Придется использовать специальный режим. Если мы предполагаем, что некоторый аргумент метода будет передаваться через неинициализированную переменную, то соответствующий аргумент в описании метода указывается с идентификатором out. При вызове метода такой аргумент также передается с использованием идентификатора out. Есть еще одно важное условие: аргументу, который передан с out-инструкцией, при выполнении метода должно присваиваться значение.
Как иллюстрацию к использованию механизма передачи неинициализированных аргументов рассмотрим программу, приведенную ниже. Там описывается метод, который для массива, переданного аргументом, возвращает значение наименьшего элемента в массиве. Массив передается первым аргументом методу. А вторым аргументом методу передается переменная (неинициализированная), в которую записывается значение индекса элемента с наименьшим значением. Проанализируем код программы.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr71_1 { class Program { // Метод для вычисления значения наименьшего элемента // в массиве и его индекса: static int getMin(int[] nums, out int index) { // Начальное значение для индекса: index = 0; // Перебор элементов массива: for(int k=1; k < nums.Length; k++){ // Если значение элемента массива меньше текущего // минимального значения: if( nums[k] < nums[index] ){ // Новое значение для индекса: index = k; } } // Результат метода: return nums[index]; } // Главный метод программы: static void Main() { // Целочисленный массив: int[] A = {12, 7, 8, 3, 8, 4, 1, 3, 4, 1, 7, 15}; // Отображение содержимого массива: foreach(int v in A){ Console.Write("| {0} ", v); } Console.WriteLine("|"); // Объявление переменных: int val, k; // Вычисление элемента с наименьшим значением: val = getMin(A, out k); // Отображение результатов: Console.WriteLine("Наименьшее значение: " + val); Console.WriteLine("Индекс элемента: " + k); Console.WriteLine("Проверка: A[{0}]={1}", k, A[k]); // Задержка: Console.ReadLine(); } } }
В этом случае результат выполнения программы такой:
Рис.1. Результат выполнения программы
Метод для вычисления значения наименьшего элемента описан достаточно просто. Он возвращает int-значение, и у него два аргумента:
index = 0;
index = k;
После завершения выполнения оператора цикла в аргумент index записано значение элемента массива с наименьшим значением. Если таких элементов несколько, то запоминается индекс первого из них. Результат метода возвращается командой
return nums[index]; .
В главном методе программы командой
int[] А = {12, 7, 8, 3, 8, 4, 1, 3, 4, 1, 7, 15};
val = getMin(A, out k); .
На следующем шаге мы рассмотрим рекурсию.