Пример передачи данных по ссылке out
МЕТОДЫ
Определение метода
Определение метода может быть выполнено только в составе класса.
Определение метода должно содержать:
1. Имя метода
2. Доступ к данному методу со стороны других
3. Принадлежность методу конкретному объекту или классу
4. Параметры, которые принимаются методом для обработки и тип возвращаемого результата
5. Собственно процедуру обработки параметров
<модификаторы>_ТипВозвращаемогоОбъекта Имя (параметры)
{
<локальные переменные> + процедура
}
Взаимодействие методов по управлению
Методы имеют непосредственный доступ к полям своего класса. Статические методы имеют доступ только к статическим полям и могут вызывать только статические методы.
Вызов метода сопровождается выполнением процедуры, определенной методом и возвратом результата в точку вызова.
Обмен данными между методами
Существует 3 способа обмена данными:
1. Использование общих полей класса (рассмотренный ранее вариант)
Обмен данными через параметры методов
Возврат данных из метода
Обмен данными через параметры методов
Виды параметров:
1. Входные (прием данных) – при вызове снимается копия аргумента и передается в метод на место параметра. Метод не имеет возможности изменить аргумент. По умолчанию все параметры считаются входными.
2. Выходные – при вызове в метод передается ссылка на область памяти, где хранится аргумент. Метод обрабатывает данные по этой ссылке, т.е. работает с оригиналом аргумента. Выходные параметры при определении метода и вызове метода должны иметь модификатор out.
3. Входные - выходные – по механизму реализации аналогичны выходным параметрам, но вызывающий метод в обязательном порядке должен определить значение метода. Выходные параметры при определении метода и вызове метода должны иметь модификатор ref.
При использовании выходных параметров аргумент должен быть именем объекта.
Возврат объекта из метода
При определении метода указывается тип возвращаемого из метода объекта. Возврат значения выполняется оператором return Объект;
Оператор прекращает выполнение метода и производит возврат в точку выова метод и возвращает в вызвавший метод на место вызова – выражение.
Выражение может определить выражение любого типа, т.е. из метода можно вернуть:
1. Значение стандартного типа (целые, вещественные и т.д.)
2. Массив
3. Объект определенного класса
Последние два варианта позволяют добиться возврата из метода множества значений.
Пример:
Определить метод, выполняющий сдвиг координат точки на заданное расстояние.
class_Example
{
public_static_void_Mov (ref int x, ref int y, int d)
{
x=x+d;
y=y+d;
}
public_static_void_Main()
{
int a=4, b=3, d=10;
Move (ref a, ref b, d);
}
}
Параметры метода Main()
Выполнение программы сводится к вызову методов в определенной последовательности. Методу могут передаваться аргументы, а из метода – возвращаться значение.
В рамках данного вопроса рассмотрим вариант, когда программа запускается из среды исполнения. Поскольку метод Main() выполняется первым при запуске программы, то именно через этот метод производится прием аргументов.
Для запуска программы в среде исполнения формируется команда. Команда должна содержать спецификацию исполнимого файла и возможно аргументы, которые в команде указываются через пробел.
C:\PR\PR\BIN\DEBUG\pr.exe_аргумент1_ аргумент2_... _аргументN
Состав параметров метода Main фиксирован: Main (string[] args)
Метод принимает параметры из команды в виде массива строк. Каждая строка хранит символьное представление одного аргумента.
Пример
Разработать программу, предназначенную для хранения в виде массива цен на товары и их изменения на заданную сумму. Изменение выполняется методами
· Plus – увеличение
· Minus – уменьшение
Исполняемый файл хранится в файле pr.exe.
Соглашение об аргументах в команде
1. Сумма
2. Вид операции
· Плюс (в любом регистре) или +
· Минус (в любом регистре) или –
3. Фамилия оператора (ключ)
Пример команды
C:\PR\PR\BIN\DEBUG\pr.exe_50_Плюс_Иванов
Массив args в Main()
public static void Plus(double[] p, double s)
// массив цен, сумма, на которую увеличиваем
{
for (int i = 0; i < p.Length; i++)
p[i] += s;
}
public static void Minus(double[] p, double s)
{
for (int i = 0; i < p.Length; i++)
p[i] -= s;
}
public static Main(string[] args)
{
double[] pr; //массив с ценами
double delta; //сумма
string key = "Иванов"; //ключ
pr = new double[] { 100.0, 200.0, 300.0 };
//проверяем сколько аргументов нам передали
if (args.Length != 3) return;
//завершение программы - ошибка1
//проверка фамилии
if (args[2] != key) return;
//завершение программы - ошибка2
//пересчет цен
delta = double.Parse(args[0]);
//чтение операции
switch (args[1].ToUpper())
{
case "ПЛЮС":
case "+": Plus(pr, delta); break;
case "МИНУС":
case "-": Minus(pr, delta); break;
}
//вывод новых цен
return;
}
Перегруженные методы
В одном классе может быть определено несколько методов с одним именем, но с разным составом параметров по количеству, типам, способу передачи аргументов. Такие методы называются перегруженными.
Перегруженные методы используются в составе классов для определения однотипных по функциональному назначению операций, реализуемых по-разному.
Выяснение конкретного метода, который будет реально вызван, производится на этапе трансляции по следующей схеме:
1. Вызывающий метод – это тот метод, который совпадает с вызовом по имени, количеству и типу параметров.
2. Если такого метода нет, вызывается метод, который совпадает с вызовом по имени и количеству параметров, при этом аргументы могут быть преобразованы к типу параметров без потери информации
3. Если такого метода нет, фиксируется ошибка.
Перегруженные методы не различаются по типу возвращаемого значения.
Конструкторы
конструктор автоматически вызывается при создании объекта и в силу этого используется, как правило, для инициализации полей объекта.
конструктор должен иметь имя, совпадающее с именем класса, конструктор не имеет возвращаемого значения.
конструкторы могут быть перегружены, вызов соответствующего конструктора выполняется при создании объекта
Пример: метод вычисления площади квадрата
public void Caller()
{
int numA = 4;
int numB = 32;
int productA = Square(numA);
int productB = Square(numB);
int productC = Square(12);
productC = Square(productA * 3);
}
int Square(int i)
{
int input = i;
return input * input;
}
Пример передачи данных по ссылке out
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value); }}