Параметры

Параметры делятся на формальные и фактические

Формальные параметры

Английское название — Formal Parameter, обычно говорят просто формальный параметр.

Формальный параметр — это особая локальная переменная, указанная в скобках при объявлении метода, а не переменная внутри тела метода.

Две переменные в скобках после имени функции, показанной ниже, являются формальными параметрами. Читатели, изучавшие язык C, хорошо знакомы с этим понятием.

// x, y — два формальных параметра
public void PrintArea(int x, float y )
{
}
Code language: C# (cs)
  1. Имеют тип данных и имя переменной, поддерживают чтение и запись;
  2. Определяются за пределами тела метода, автоматически инициализируются перед запуском метода (исключение — выходные параметры out);
  3. Несколько параметров разделяются запятыми, ограничений по количеству нет;
  4. Внутри тела метода используются точно так же, как обычные локальные переменные.

Проще говоря, формальные параметры — это специальные локальные переменные, предназначенные для приёма значений, передаваемых при вызове функции. Присвоение значений происходит именно в момент вызова, к тому времени, когда управление перейдёт внутрь функции, формальные параметры уже получат свои значения.

public void PrintArea( int x, float y )
{
    float area = x * y; // x, y — формальные параметры, area — обычная локальная переменная для хранения произведения x и y
    Console.WriteLine($"Вычисление площади: { x } * { y } = { area }");
}
Code language: C# (cs)

Рабочий пример

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.PrintArea(10,6.5F);
    }

    public void PrintArea(int x, float y)
    {
        float area = x * y; // x, y — формальные параметры, area — обычная локальная переменная для хранения произведения x и y
        Console.WriteLine($"Вычисление площади: {x} * {y} = {area}");
    }
}Code language: C# (cs)

Вывод

Вычисление площади: 10 * 6.5 = 65

При вызове функции происходит то же самое, что инициализация x значением 10, а y значением 6.5

Буква F после 6.5F указывает, что это число с плавающей точкой одинарной точности float. Без суффикса F компилятор воспримет значение как double и выдаст ошибку.

Тип float (одинарная точность) и double (двойная точность) занимают разное количество бит в памяти, поэтому отличается точность хранимых значений.

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

x и y — формальные параметры. При вызове

происходит нечто похожее на инициализацию двух локальных переменных этими значениями.

int x = 10;

float y = 6.5F;Code language: C# (cs)

Важно:

Тип, порядок и формат формальных параметров вместе с именем метода формируют сигнатуру метода. Сигнатуру можно сравнить с удостоверением личности функции. Позже мы изучим сигнатуры: совпадение сигнатур определяет, являются ли методы одинаковыми, также разберём перегрузку функций.


Фактические параметры

Английское название: Actual Parameters (фактические параметры, также называют аргументами)

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

  1. Фактические параметры записываются в скобках при вызове метода;
  2. Правило совпадения типов: тип фактического параметра должен совпадать с соответствующим формальным параметром, либо компилятор поддерживает неявное преобразование типов;
  3. Соответствие по позиции: по умолчанию сопоставление идёт последовательно (позиционные параметры).

Например, изменим функцию Main в коде выше. В точке вызова первый аргумент — литерал 5, второй — локальная переменная f.

Program program = new Program();
float f = 6.3F;
program.PrintArea(5,f);
// 5 — фактический параметр в виде константного выражения, f — фактический параметр-переменная
// Соответствие по позиции: 5 → x, f → y
Code language: C# (cs)

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


Позиционные параметры

class Calculate
{
    // Два формальных параметра типа int
    public int Sum(int x, int y)
    {
        return x + y;
    }

    // Два формальных параметра типа float
    public float Avg(float x, float y)
    {
        return (x + y) / 2.0F;
    }
}

class Program
{
    static void Main()
    {
        Calculate cal = new Calculate();
        int num = 6;

        // Sum: фактический параметр int соответствует формальному параметру int
        Console.WriteLine("Sum: {0} and {1} is {2}",
            5, num, cal.Sum(5, num));

        // Avg: фактический параметр int неявно преобразуется в float
        Console.WriteLine("Avg: {0} and {1} is {2}",
            5, num, cal.Avg(5, num));
    }
}
Code language: PHP (php)
Результат вывода
Sum: 5 and 6 is 11
Avg: 5 and 6 is 5.5Code language: HTTP (http)

В C# поддерживается неявное преобразование от типов с меньшим диапазоном к типам с большим диапазоном (int → float). Обратное преобразование float → int вызовет ошибку компиляции, требуется ручное явное преобразование.

num — переменная типа int. При передаче как фактический параметр в формальный параметр float функции Avg компилятор автоматически выполняет неявное преобразование int во float без ошибок. Диапазон значений int полностью входит в диапазон float.

Поэтому передача значения int в переменную float не приводит к потере данных. Это похоже на помещение маленькой коробки в большую. Наоборот, большую коробку в маленькую поместить нельзя.

Параметры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *