C#. Поняття методу. Методи в класах. Повернення з методу. Оператор return. Методи без параметрів. Ключове слово void




Поняття методу. Методи в класах. Повернення з методу. Оператор return. Методи без параметрів. Ключове слово void


Зміст


Пошук на інших ресурсах:

1. Що таке метод у класі? Визначення методу в класі

Метод (функція) – це фрагмент підпрограми, яка має ім’я. За цим іменем можна викликати підпрограму (метод) один або декілька разів. Замість імені буде підставлятись тіло підпрограми (методу). Ім’я методу доцільно давати таким, щоб легко можна було розпізнати його функціональну роботу.

Крім даних (змінних) класи можуть містити і методи. Методи роблять над даними деякі операції (деяку роботу). У багатьох випадках методи представляють доступ до даних класу. З допомогою методів класу відбувається взаємодія класу з іншими частинами програми або іншими класами.
Методи доповнюють клас додатковими функціональними можливостями. Як правило, кожен метод виконує одну функцію.

 

2. Які імена забороняється давати методам?

Ім’я методу можна давати будь-яке, яке відповідає правилам використання ідентифікаторів в C#. Однак не всі імена можна використовувати як ім’я методу.

В якості імені методу забороняється задавати:

  • ім’я Main(). Це ім’я точки входу в програму на C#, тобто з методу Main() починається виконання програми. Це ім’я зарезервоване;
  • імена ключових слів C#.

 

3. Загальна форма визначення методу в класі

В загальному реалізація методу в класі має такий вигляд:

access return_type MethodName(parameters_list)
{
    // тіло методу
    // ...
}

де

  • MethodName – ім’я методу, що оголошується. За цим іменем можна викликати метод з класу або програми. При виклику методу обов’язково вказуються параметри методу, які він отримує;
  • access – модифікатор що визначає доступ до методу з різних частин програми. Модифікатор доступу може бути private, protected, public. Модифікатор доступу може бути відсутній взагалі, у цьому випадку метод вважається закритим (private);
  • return_type – тип, що повертає метод. Якщо метод не повертає значення, вказується тип void;
  • parameter_list – список параметрів, що отримує метод. Метод може не мати параметрів. У цьому випадку в дужках нічого не вказується.

 

4. Яке призначення оператора return?

Оператор return призначений для повернення значення з методу. Якщо метод повертає якесь значення, то виклик оператора return є обов’язковим.
Оператор return має дві форми. Перша форма використовується, коли метод повертає значення. Друга форма, коли метод не повертає значення, тобто повертає тип void.

Перша форма оператора return, що викликається в методі:

return value;

де value – значення, яке повертає метод. Тип value повинен бути сумісним з типом, що повертає метод.

Друга форма використовується, коли метод не повертає значення (void). У цьому випадку оператор return має вигляд:

return;

У методі, який не повертає значення, вказувати оператор return не обов’язково.

 

5. Приклади методів у класах

Приклад 1. У прикладі реалізується клас DemoString. У класі оголошується:

  • внутрішня змінна s типу string, що є рядком;
  • конструктор класу без параметрів. Ініціалізує рядок s пустим значенням;
  • конструктор класу з параметром, який ініціалізує рядок s;
  • метод IsLetter(), який визначає чи є символ c в рядку s. Символ c задається вхідним параметром методу. Метод повертає значення логічного типу bool;
  • метод Reverse(), який приймає вхідним параметром рядок s і повертає обернене значення цього рядка.

Текст реалізації класу наступний

// клас, що реалізує обробку рядків
class DemoString
{
    // методи класу
    // визначає, чи є символ c в рядку s
    public bool IsLetter(char c, string s)
    {
        for (int i = 0; i < s.Length; i++)
            if (s[i] == c) return true;
                return false;
    }

    // метод, що повертає реверсний рядок s: "abcd" => "dcba"
    public string Reverse(string s)
    {
        string s2 = "";
        int len = s.Length;

        for (int i = 0; i < len; i++)
            s2 += s[len - i - 1];

        return s2;
    }
}

Використання класу DemoString може бути таким:

DemoString ds = new DemoString();
string s2;
s2 = ds.Reverse("abcde"); // s2 = "edcba"
bool f = ds.IsLetter('p', "bestprog.net"); // f = True

Приклад 2. Оголошується клас Triangle, який містить:

  • три внутрішні змінні з іменами a, b, c;
  • параметризований конструктор класу, який отримує три параметри;
  • внутрішній метод класу GetArea(), що визначає площу трикутника за його сторонами a, b, c. Метод не отримує параметрів. Метод повертає значення площі трикутника або 0, якщо за сторонами a, b, c не можна побудувати трикутник;
  • внутрішній метод класу без параметрів IsTriangle(). Метод визначає, чи за трьома сторонами a, b, c можна побудувати трикутник взагалі: сума двох будь-яких сторін має бути більша за третю сторону. Метод повертає логічне значення типу bool.

Текст оголошення класу має наступний вигляд:

// клас, що описує трикутник за трьома сторонами a, b, c
class Triangle
{
    double a, b, c; // сторони трикутника

    // конструктор
    public Triangle(double _a, double _b, double _c)
    {
        // виклик внутрішнього методу класу з конструктора
        if (!IsTriangle()) return;

        a = _a;
        b = _b;
        c = _c;
    }

    // метод класу, що визначає площу трикутника
    public double GetArea()
    {
        double p,s;
        // виклик внутрішнього методу з методу, перевірка
        if (!IsTriangle()) return 0.0;
        p = (a + b + c) / 2.0;
        s = Math.Sqrt(p * (p - a) * (p - b) * (p - c));
        return s;
    }

    // метод класу, що визначає, чи за даними a, b, c можна побудувати трикутник
    public bool IsTriangle()
    {
        if ((a + b) < c) return false;
        if ((b + c) < a) return false;
        if ((a + c) < b) return false;
        return true;
    }
}

Використання класу Triangle та виклик методів класу може бути таким:

// використання класу Triangle та його методів
Triangle tr1 = new Triangle(5, 6, 3);
Triangle tr2;
tr2 = new Triangle(7, 7, 7);

double area;
area = tr1.GetArea(); // area = 7.483314

bool isTriangle = tr2.IsTriangle(); // isTriangle = true
area = tr2.GetArea(); // area = 21.217622

 

6. Аргументи та формальні параметри методу

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

Наприклад. Нехай задано метод, що знаходить суму цифр цілого числа d, що є вхідним параметром

// метод, що повертає суму цифр числа d
public int Sum(int d) // d - формальний параметр
{
    int t = d;
    int sum;

    if (t < 0) t = -t;

    sum = 0;
    while (t > 0)
    {
        sum = sum + t % 10;
        t = t / 10;
    }

    return sum;
}

При виклику такого методу йому передається аргумент x, значення якого рівне -2398. Цей аргумент передається формальному параметру d в методі Sum().

int x = -2398;
int sum;
sum = Sum(x); // x - аргумент методу Sum(), sum = 22

 

7. Як параметри передаються в метод? Синтаксис опису параметрів методу

Будь-який метод може отримувати параметри. Параметри необхідні методу для того, щоб проводити над ними деякі обчислення. Параметри методу задаються в дужках через кому. Загальна форма переліку N параметрів методу має вигляд:

type1 param1, type2 param2, ..., typeN paramN

Загальна форма методу, що отримує N параметрів має вигляд:

return_type MethodName(type1 param1, type2 param2, ..., typeN paramN)
{
    // ...
}

де

  • return_type – тип, що повертається методом MethodName;
  • type1, type2, … typeN – типи, що мають параметри з іменами param1, param2, …, paramN.

 

8. Використання ключового слова void в параметрах методів

Якщо метод не отримує параметрів, то запис методу виглядає так:

return_type MethodName()
{
    // ...
}

де return_type – тип, що повертає метод з іменем MethodName().

Наприклад. Оголошується метод, що повертає число Pi.

// метод, що не отримує параметрів
double Pi()
{
    return 3.14159265358979323846;
}

Якщо метод нічого не повертає, то замість типу вказується слово void

void MethodName(parameters_list)
{
    // ...
}

де parameter_list – перелік параметрів методу з іменем MethodName, які він отримує.

Якщо метод не повертає і не отримує параметрів, то загальний вигляд такого методу наступний:

void MethodName()
{
    // ...
}

Приклад. Оголошується метод, що не отримує і не повертає нічого. В тілі методу виводиться повідомлення “Hello world!” для консольних додатків.

// метод, що не отримує і не повертає параметрів
void Hello()
{
    Console.WriteLine("Hello world!");
}

 

9. Що означає термін “недоступний код” в методі?

Недоступний код – це частина коду методу, який не виконається в любому випадку. Недоступний код є помилкою програміста. Якщо у методі є недоступний код, то компілятор видає попереджувальне повідомлення відповідного вмісту.

Наприклад. Нижче продемонстровано метод, в якому є недоступний (невикористаний) код.

// метод, що містить невикористаний код
bool More5(int n)
{
    if (n > 5) return true;
    else return false;

    // невикористаний код
    return true; // цей оператор ніколи не виконається
}

 

10. Приклад, що демонструє різні способи повернення екземпляру класу з методу

У прикладі продемонстровано різні способи повернення об’єкту класу з методу. За подібним прикладом можна розробляти власні методи, що повертають поточний екземпляр класу.

Задано клас Complex, який реалізує комплексне число. У класі оголошуються:

  • дві внутрішні змінні real, imag;
  • два конструктори;
  • метод GetRI(), який повертає значення внутрішніх змінних real та imag як out-параметрів;
  • метод SetRI(), який з допомогою параметрів встановлює нові значення внутрішніх змінних real, imag;
  • метод GetComplex(), який повертає поточний об’єкт (екземпляр) класу Complex з допомогою оператора return;
  • метод GetComplex2(), який повертає поточний об’єкт (екземпляр) класу як out-параметр.В іншому класі Program у функції main() продемонстровано використання класу Complex та методів GetComplex(), GetComplex2(). Також у класі Program оголошується метод GetComplex3(), який повертає екземпляр класу Complex.

Текст усього програмного модуля, створеного за шаблоном Console Application наступний

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp6
{
    // клас, що реалізує комплексне число
    class Complex
    {
        // внутрішні змінні
        private double real; // дійсна частина
        private double imag; // уявна частина

        // конструктори
        public Complex()
        {
            real = imag = 0;
        }

        public Complex(double _real, double _imag)
        {
            real = _real;
            imag = _imag;
        }

        // методи доступу
        // отримати значення змінних real, imag
        public void GetRI(out double _real, out double _imag)
        {
            _real = real;
            _imag = imag;
        }

        // встановити нові значення real та imag
        public void SetRI(double _real, double _imag)
        {
            real = _real;
            imag = _imag;
        }

        // метод, що повертає поточний екземпляр (об'єкт) класу Complex
        public Complex GetComplex()
        {
            return this;
        }

        // метод, що повертає об'єкт класу Complex як out-параметр
        public void GetComplex2(out Complex _cmp)
        {
            Complex cmp = new Complex(real, imag); // створити об'єкт
            _cmp = cmp; // виконати присвоєння
        }
    }

    class Program
    {
        // метод класу Program, який повертає об'єкт (екземпляр) класу Complex
        public Complex GetComplex3(double _real, double _imag)
        {
            Complex comp = new Complex();
            comp.SetRI(_real, _imag);
            return comp;
        }

        static void Main(string[] args)
        {
            // використання методів GetComplex() та GetComplex2() класу Complex
            Complex c = new Complex(3, 5); // створити екземпляр класу
            double i, r;

            // повернення об'єкту з допомогою методу GetComplex()
            Complex c2; // оголосити посилання на клас Complex
            c2 = c.GetComplex();

            // перевірка 
            c2.GetRI(out i, out r); // i=3, r=5

            Console.WriteLine("Method GetComplex():");
            Console.WriteLine("i = {0}", i);
            Console.WriteLine("r = {0}", r);

            // повернення екземпляру класу Complex як out-параметра
            Complex c3; // посилання на Complex

            c.GetComplex2(out c3); // повернути об'єкт класу Complex

            // перевірка
            c3.GetRI(out i, out r); // i=3, r=5

            Console.WriteLine("Method GetComplex2():");
            Console.WriteLine("i = {0}", i);
            Console.WriteLine("r = {0}", r);

            Console.ReadKey();
        }
    }
}

З вищенаведеного прикладу видно, що продемонстровано повернення об’єкту класу Complex з допомогою трьох методів (способів):

  • повернення екземпляру поточного класу оператором return – метод GetComplex() класу Complex;
  • повернення екземпляру класу Complex з допомогою out-параметру – метод GetComplex2() класу Complex;
  • повернення екземпляру класу Complex з методу іншого класу – метод GetComplex3() класу Program.

У результаті виконання програми буде виведено наступний результат

Method GetComplex():
i=1
r=5

Method GetComplex2():
i=3
r=5

 


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