Шаг 71.
Язык программирования C#. Начала
Статические методы. Механизмы передачи аргументов методу (окончание)

    На этом шаге мы рассмотрим передачу неинициализированных аргументов.

    С передачей аргументов связан еще один механизм, позволяющий передавать в метод переменные, которым не присвоено значение - то есть неинициализированные аргументы. Необходимость в использовании такого подхода может возникнуть, когда при выполнении метода нужно вернуть не одно значение, а сразу несколько. Можно, конечно, эти значения реализовать в виде массива, но этот прием не всегда приемлем. Можно передать аргумент по ссылке. Но в таком случае есть одна проблема: данному аргументу необходимо предварительно присвоить значение. И это тоже не всегда приемлемо. В таких случаях можно использовать передачу неинициализированного аргумента. То есть мы можем передать аргументом переменную, которая объявлена в программе, но значение ей не присваивалось. Просто так это сделать не получится - при компиляции возникнет ошибка. Придется использовать специальный режим. Если мы предполагаем, что некоторый аргумент метода будет передаваться через неинициализированную переменную, то соответствующий аргумент в описании метода указывается с идентификатором 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 присваивается начальное нулевое значение (индекс первого элемента в массиве). Затем перебираются прочие элементы массива (начиная со второго). Каждый очередной элемент сравнивается со значением элемента, чей индекс записан в аргумент index (условие nums[k] < nums[index] в условной конструкции). Если значение проверяемого элемента с индексом k меньше значения элемента с индексом index, то командой
  index = k; 
аргумент index получает новое значение.

    После завершения выполнения оператора цикла в аргумент index записано значение элемента массива с наименьшим значением. Если таких элементов несколько, то запоминается индекс первого из них. Результат метода возвращается командой

  return nums[index];     . 
В данном случае мы по индексу элемента определяем значение элемента, и это значение является результатом метода.

    В главном методе программы командой

  int[] А = {12, 7, 8, 3, 8, 4, 1, 3, 4, 1, 7, 15}; 
создается и инициализируется целочисленный массив. Содержимое массива отображается в консольном окне. Также в программе объявляются две целочисленные переменные val и k. Несмотря на то, что переменной k значение не присваивалось, выполняется команда
  val = getMin(A, out k);           .
Второй аргумент методу getMin() передается с out-инструкцией. После выполнения команды в переменную val записывается значение элемента с наименьшим значением, а в переменную k записывается значение индекса этого элемента (первого из них). Значение переменных val и k отображается в консольном окне. Для проверки мы также отображаем значение элемента из массива А с индексом k (элемент А[k]). Понятно, что значения переменной val и элемента А[k] должны совпадать.


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

    На следующем шаге мы рассмотрим рекурсию.




Предыдущий шаг Содержание Следующий шаг