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;
        // вызов внутреннего метода из метода GetArea(), проверка
        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 = 2+3+9+8

 

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

 


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