Передача параметрів у метод. Аргументи і формальні параметри. Приклади передачі параметрів у методи. Передача посилання на об’єкт класу в метод

Передача параметрів у метод. Аргументи і формальні параметри. Приклади передачі параметрів у методи. Передача посилання на об’єкт класу в метод


Зміст



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;
    }
}

 


Зв’язані теми