Передача параметров в метод. Аргументы и формальные параметры. Примеры передачи параметров в методы. Передача ссылки на объект класса в метод

Передача параметров в метод. Аргументы и формальные параметры. Примеры передачи параметров в методы. Передача ссылки на объект класса в метод


Содержание


1. Что такое аргументы и формальные параметры метода? Пример

Аргументы – это значения, которые передаются в метод при его вызове. Формальные параметры – это значения, которые получают значение аргументов в методе. Формальные параметры используются в методе для выполнения вычислений, операций или действий в методе.
При вызове метода значение аргументов копируются (передаются) в формальные параметры метода. Существует несколько способов передачи аргументов методу.

Пример. Демонстрируется передача аргумента целого типа в метод. Задан метод Sqr(), который получает целое число и возвращает квадрат этого числа

public int Sqr(int x) // x - формальный параметр
{
    return x * x;
}

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

int a, b;
a = 5;

// вызов метода Sqr()
b = Sqr(a); // a - аргумент, b = 25
b = Sqr(15); // 15 - аргумент, b = 225

В вышеприведенном коде вызов метода Sqr() происходит два раза.
Первый раз значение аргумента a = 5 копируется в формальный параметр x. Производится вычисление в методе Sqr() и результат (25) возвращается из метода операцией return.
При втором вызове, точно так же, значение числа 15, которое есть аргументом, копируется в формальный параметр x. Затем происходит вычисление и результат (225) возвращается оператором return.

 

2. Какие существуют способы передачи аргумента методу?

В языке C# существует два основных способа передачи аргумента методу:

  • передача по значению (passing by value). В этом случае значение аргумента копируется в формальный параметр метода, как описано в предыдущем пункте. При этом способе передачи, все изменения над формальным параметром, которые происходят в методе, не влияют на аргумент который использовался при вызове;
  • передача по ссылке (passing by reference). В этом случае методу передается ссылка на аргумент. Таким образом, если изменить формальный параметр метода, то изменится и аргумент, который был использован при вызове метода.


 

3. Какой способ передачи аргумента методу используется в C# по умолчанию?

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

 

4. Пример, который демонстрирует передачу по значению аргументов базовых типов

В примере демонстрируется передача аргументов таких базовых типов как int, double, char

// класс, который демонстрирует передачу по значению
class PassingValue
{
    // передача по значению типа int
    public void IntValue(int t) // t - формальный параметр
    {
        t = 100; // это изменение на аргумент не влияет
        return;
    }

    // передача по значению типа char
    public void CharValue(char c)
    {
        c = 'F'; // изменение c не влияет на аргумент
    }

    // передача по значению типа double
    public void DoubleValue(double d)
    {
        d = 12.333; // изменение d в методе не влияет на аргумент
    }
}

class Program
{
    static void Main(string[] args)
    {
        PassingValue pv = new PassingValue();

        // вызов методов, в которых изменяются значения аргументов
        int x = 15;
        pv.IntValue(x); // x = 15 после выхода из метода, то есть не изменяется
        Console.WriteLine("x = {0}", x);

        pv.CharValue('M'); // делается копия со значения 'M'

        double z = 3.88;
        pv.DoubleValue(z);
        // после выхода из метода z = 3.88, то есть не изменяется
        Console.WriteLine("z = {0}", z);
        Console.ReadLine();

        return;
    }
}

В примере, в методах IntValue(), CharValue(), DoubleValue() изменяются значения формальных параметров внутри методов. Такое изменение не влияет на аргументы, которые передавались в эти методы.

 

5. Как осуществляется передача в метод ссылки на объект класса. Пример

Непосредственно объект класса в метод не передается. Однако в метод передается ссылка на объект. Как и в случае с базовыми типами, при передаче ссылки на объект в метод, происходит копирование этой ссылки в формальный параметр метода. Значит, формальный параметр в методе содержит точно такое же значение как и аргумент, который передавался методу.

Пример. Передается объект класса Triangle в метод. Класс Triangle реализует треугольник, который задан координатами точек. В методе Perimeter класса Triangle реализуется вычисление периметра треугольника.

// класс, который описывает треугольник
class Triangle
{
    public double x1, y1, x2, y2, x3, y3;

    // конструктор класса
    public Triangle(double _x1, double _y1, double _x2, double _y2, double _x3, double _y3)
    {
        x1 = _x1; y1 = _y1;
        x2 = _x2; y2 = _y2;
        x3 = _x3; y3 = _y3;
    }

    // метод, который получает входным параметром ссылку на объект класса Triangle,
    // метод вычисляет периметер
    public double Perimeter(Triangle T)
    {
        double a, b, c;
        a = Math.Sqrt(Math.Pow(T.x1 - T.x2, 2) + Math.Pow(T.y1 - T.y2, 2));
        b = Math.Sqrt(Math.Pow(T.x1 - T.x3, 2) + Math.Pow(T.y1 - T.y3, 2));
        c = Math.Sqrt(Math.Pow(T.x2 - T.x3, 2) + Math.Pow(T.y2 - T.y3, 2));
        return a + b + c;
    }
}

Как видно из вышеприведенного кода, метод Perimeter() получает входным параметром ссылку T на объект класса Triangle. Сама ссылка передается по значению. С помощью ссылки T можно доступиться к методам и данным (полям) класса Triangle.
Использование класса Triangle и вызов метода Perimeter() из другого программного кода может быть следующим:

...

// создание объекта класса
Triangle tr = new Triangle(1, 3, 4, 5, 0, 7);

double p;

// объект (экземпляр) класса tr передается в метод Perimeter
p = tr.Perimeter(tr); // p = 12.20079

...

В вышеприведенном коде объявляется ссылка с именем tr на объект класса Triangle. Затем эта ссылка передается в метод Perimeter() для вычисления периметра.

 

6. Можно ли изменить внутренние данные объекта класса в методе, которому передается ссылка на этот объект?

Да можно. Если методу передается ссылка на объект, то эта ссылка (аргумент) копируется в формальный параметр. Ведь и аргумент и формальный параметр указывают на один и тот же объект. Поэтому с помощью формального параметра метода (ссылки) можно изменять данные объекта который передавался в метод.

Например. Объявляется класс DemoInt, в котором есть:

  • внутренняя переменная t;
  • метод Change100(), который получает ссылку на класс DemoInt. В методе Change100() значение внутренней переменной t входного формального параметра изменяется на 100.

С целью демонстрации, в функции Main() класса Program выполняются следующие действия:

  • создается объект di класса DemoInt;
  • значение внутренней переменной t объекта di становится равным 25;
  • вызывается метод Change100(), в котором di.t становится равным 100;
  • происходит проверка с помощью переменной res. Переменная res = 100 а не 25. Это означает, что при передаче объекта класса по ссылке в метод, данные этого объекта можно изменить в этом методе.
// объявление класса, который содержит 1 внутренний член данных
class DemoInt
{
    public int t; // внутренняя переменная

    // метод получает ссылку на объект класса DemoInt
    public void Change100(DemoInt di)
    {
        di.t = 100; // изменить член данных объекта di
    }
}

class Program
{
    static void Main(string[] args)
    {
        // создание объекта класса
        DemoInt d = new DemoInt();

        // изменение значения в объекте класса
        d.t = 25;

        // передача ссылки в объект класса
        d.Change100(d); // в методе изменяется значение d.t

        int res = d.t; // res = 100, произошло изменение: d.t = 100

        return;
    }
}

 


Связанные темы