Ключевые слова ref и out. Примеры использования

Северо-восточный федеральный университет имени М.К.Аммосова

Институт математики и информатики

 

 

Реферат

 

Методы на языке c#

 

                                                               Выполнил:

                                                                  Мохов У.В.

 

 

                            Якутск 2017 год


Содержание:

Описание метода. Модификаторы

Немного о методе Main ()

Варианты написания метода Main ()

Перегрузка методов

Ключевые слова ref и out. Примеры использования

Рекурсивный вызов метода

Пример программы "Рекурсивный вызов"

Ключевое слова this

 

Описание метода. Модификаторы

 

"В общем виде объявление метода выглядит так:

Модификатор тип_возв_значения Имя (параметры)

{

Код (действия);

return значение; // в случае, если тип функции НЕ void

}

О том, что это метод говорят круглые скобки после имени, а перед именем указывается тип метода.

Тип_возв_значения - тип данных результата работы метода.

Параметры - список формальных параметров (один или несколько), с указанием их типов.

Модификатором может выступать public, protected, internal и private, с помощью них определяется доступен ли метод внешним классам или наследникам. ” [2]- методы можно вызывать только в методах самого класса.- методы будут доступны для методов класса и классов, которые связаны с исходным отношением "родитель - потомок".

К public - методам можно обращаться из любого места программы.

Модификатор доступа internal используется для методов, доступных всем классам, определенным в конкретной сборке. Если модификатор доступа не указан, по умолчанию методы считаются закрытыми (private).

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


Немного о методе Main ()

 

public static void Main ()

{

Console. WriteLine ("Hello World”);

}

"В данном случае тип значения, которое возвращает метод, равен public static void (открытый, статичный, пустой). ” [2]

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

В фигурных скобках (обозначающих начало и конец метода) идет код, т.е. действия, которые выполняет метод. В моем случае это вывод на консоль сообщения - Console . WriteLine (" Hello World ”);. Эта строка - вызов метода другого класса. Вызов осуществляется следующим образом:

Имя_объекта. Имя_метода (Параметры);

Если метод находится в объекте, из которого вызываем, то можно вызвать так Имя_метода (Параметры);

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

Благодаря тому, что описание и реализация находятся в одном файле, код становится более компактным и мобильнее, "что является одной из основных особенностей технологии.net” [2].

Варианты написания метода Main ()

 

static void Main ()

{

}int Main ()

{Целое_число;

}void Main (string [] args)

{

}public int Main (string [] args)

{

return Целое_число;

}

 

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

Таким образом, метод может возвращать пустое значение или число, или не принимать никаких параметров вообще либо принимать массив строк.

"Почему в качестве параметра передается именно массив строк? Потому что, когда операционная система вызывает программу, может передать ей в качестве параметров одну строку. Это уже сама программа разбивает монолитную строку на массив, а разделителем выступает пробел" [2].

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

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

Перегрузка методов

 

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

Например, "в классе Console для печати какого - либо сообщения существует 19 перегруженных методов WriteLine ():

·WriteLine () - записывает текущий признак конца строки в стандартный выходной поток;

·WriteLine (double) - записывает текстовое представление вещественного числа в стандартный выходной поток;

·WriteLine (String) - записывает заданную строку в стандартный выходной поток;

·WriteLine (String, object []) - записывает текстовые представления заданного массива объектов в стандартный выходной поток с использованием заданных сведений о форматировании и т.д." [2]

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

 

public void user ()

{. WriteLine ("Пустой метод\n");

}void useru (string Name)

{. WriteLine ("Имя пользователя: {0}",Name);

}void useru (string Name, string Sername)

{. WriteLine ("Имя пользователя: {0}\nФамилия пользователя: {1}",Name, Sername);

}void useru (string Name, string Sername, byte Age)

{. WriteLine ("Имя пользователя: {0}\nФамилия пользователя: {1}\nВозраст: {2}", Name, Sername, Age);

}Program

{void Main (string [] args)

{user1 = new UserInfo ();

// Разные реализации вызова перегружаемого метода

user1. useru ();. useru ("Сидоров", "Петр", 14);

Console. ReadLine ();

}

}

 

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

Чтобы на экран вывело имя и фамилию, то нужно использовать третий способ перегрузки. И последнему методу соответствуют 3 параметра: имя, фамилия и возраст.

 

Ключевые слова ref и out. Примеры использования

 

Для того чтобы в функцию передать не значение, а саму переменную, (чтобы ее можно было изменять) в объявлении этого метода перед именем параметра нужно указать ключевое слово ref. Передавать нужно именно переменную, проинициализированную, т.к. "внутрь метода будет передана ссылка на память переменной, а не ее значение, метод будет работать с его значением напрямую, а не через свою локальную переменную” [2]. Причем, ref необходимо ставить перед каждой переменной.

"Массив theArray объявлен в вызывающем (метод Main) и инициализирован в методе FillArray. Затем элементы массива возвращаются вызывающему и отображаются. ”

 

class TestOut

{

static void FillArray (out int [] arr)

{

arr = new int [5] { 1, 2, 3, 4, 5 }; // Инициализация массива

}

static void Main ()

{

int [] theArray; // Инициализация не требуется

// Передача массива вызывающему, используя out

FillArray (out theArray);

// Вывод на консоль. Console. WriteLine ("Array elements are: ");(int i = 0; i < theArray. Length; i++)

{. Console. Write (theArray [i] + " ");

}. Console. ReadLine ();

}

}

// Array elements are: 1 2 3 4 5

 

Массив theArray инициализирован в вызывающем (метод Main) и подставляется в метод FillArray при помощи параметра ref. Некоторые из элементов массива обновляются в методе FillArray. Затем элементы массива возвращаются вызывающему и отображаются.

 

class TestRef

{void FillArray (ref int [] arr)

{

// Создание массива

if (arr == null)

{= new int [10];

}

// Заполнение[0] = 1111;[4] = 5555;

}void Main ()

{

// Инициализация массива [] theArray = { 1, 2, 3, 4, 5 };

// Передача массива, используя ref

FillArray (ref theArray);

// Вывод на консоль. Console. WriteLine ("Array elements are: ");(int i = 0; i < theArray. Length; i++)

{. Console. Write (theArray [i] + " ");

}. Console. ReadLine ();

}

}

// Array elements are: 1111 2 3 4 5555

 

Пример использования методов:

 

static void Zapol (ref int [,] a)

{(int i = 0; i < a. GetLength (0); i++)

{(int j = 0; j < a. GetLength (1); j++)

a [i, j] = 0; // заполняем массив нулями

}

 

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

 

static void Tabl (int [,] a)

{. WriteLine ("Массив - ");(int i = 0; i < a. GetLength (0); i++)

{(int j = 0; j < a. GetLength (1); j++)

{. Write ("{0, 2}",a [i,j]); // выводим массив(j == a. GetLength (1) - 1)

{. WriteLine ();

}

}

} Console. WriteLine ();

}

 

Этот метод дан в качестве примера, поскольку он выводит полученную матрицу.

 

static void Main (string [] args)

{. WriteLine ("Размерность строк = ");n = int. Parse (Console. ReadLine ());. WriteLine ("Размерность столбцов = ");m = int. Parse (Console. ReadLine ());[,] mas = new int [n, m];(ref mas);(mas); }

Вызывающий метод.


Рекурсивный вызов метода

 

Рекурсивный вызов метода - это когда метод вызывает сам себя.

void MethodName ()

{

MethodName ();

}

 

"Такой метод корректен с точки зрения программирования на языке C#, но не корректен для выполнения” [2]. Т.к. он будет бесконечно вызывать сам себя, и программа зависнет. Необходим выход, т.е. такое состояние, при котором рекурсия прервется. Обычно его используют в ситуациях, когда легко свести и сходную задачу к задаче того же вида, но с другими исходными данными, например, уменьшение размерности задачи, переход в новую точку и пр.

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

Пример программы "Рекурсивный вызов"

Program

{

// метод поиска факториала целого числа

static int Factorial (int n)

{

// условие выхода из рекурсии

if (n==1 || n==0) return 1;

return n*Factorial (n-1); // рекурсивный вызов

}void Main (string [] args)

{n;. WriteLine ("Введите n: "); k=Factorial (n); // первый вызов функции

Console. WriteLine ("{0}! ={1}",n,k);

}

 

Рис. Схема рекурсии

 

Ключевое слова this

 

При вызове метода ему автоматически передается неявно заданный аргумент, который представляет ссылку на объект, для которого вызывается метод. Эта ссылка называется ключевым словом this. "Рассмотрим пример программы, создающий класс Rect, который инкапсулирует, т.е. делает доступными только внутри класса, значения ширины и длины прямоугольника и включает метод area (), вычисляющий площадь фигуры” [1].

Оно обеспечивает доступ к текущему экземпляру класса. Одно из возможных применений ключевого слова this состоит в том, чтобы исключить неоднозначность контекста, которая может возникнуть, когда входящий параметр (int w) назван так же, как поле данных данного типа (int width). Разумеется, в идеале необходимо просто придерживаться соглашения об именовании, которое не может привести к такой неоднозначности.

 

class Rect {int width;int height;Rect (int w, int h) {. width = w; // здесь можно было бы и не использовать this

this. height = h; }int area () {

return this. width * this. height; } // перемножаются копии переменных, связанные с вызывающим объектом

}UseRect {static void Main () {r1 = new Rect (4,5);r2 = new Rect (7,9);. WriteLine ("Площадь прямоугольника r1: ” + r1. area ());. WriteLine ("Площадь прямоугольника r2: ” + r2. area ()); }

}

 

 

Т.к. синтаксис позволяет, чтобы имя параметра и локальной переменной совпадало с именем переменной экземпляра. Например,

 

public Rect (int width, int height) {. width = width;. height = height; }

 

В этом случае локальное имя будет скрывать переменную экземпляра. И для доступа к скрытой переменной используют ссылку this.

метод язык алгоритм программа


 

 


Дата добавления: 2018-09-22; просмотров: 276; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!