четверг, 30 декабря 2021 г.

Методы в Си Шарп | C#

 

Метод – это конструкция в виде блока кода, которая выполняет некоторые действия, и имеет логическую смысловую нагрузку. Аналогом методов языка C#, являются математические функции



Синтаксически метод выглядит следующим образом:

<modifiers> type name(<parameters>)
{
    //тело метода
}
  • modifiers – необязательные модификаторы доступа;
  • type – возвращаемый тип данных:
    • если метод не возвращает значения, то используется тип void;
    • если возвращает, то в теле метода должно присутствовать ключевое слово return, после которого указывается возвращаемое значение(того же типа что и тип метода);
  • name – имя метода;
  • parameters – необязательные параметры.

Оператор return

Оператор return завершает выполнение метода, и может возвращать значение. Инструкции которые размещены после return игнорируются. В методе разрешается многократное использование оператора return, но иногда это усложняет читабельность кода программы. Если метод имеет тип void – оператор return может использоваться для преждевременного выхода:

static void Test(int i)
{
    if (i <= 0 || i > 5)
    {
        return;
        Console.Write("123"); //эта строка кода всегда игнорируется
    }

    Console.WriteLine(i);
}

static string ZeroCompare(double number)
{
    if (number < 0)
    {
        return "Число меньше нуля";
    }
    else if (number > 0)
    {
        return "Число больше нуля";
    }

    return "Число равно нулю";
}

Передача параметров по значению

Для примитивных типов данных, передача параметров передача параметров в метод, производиться по значению. То есть в качестве аргумента передается копия данных. В теле метода, мы можем изменять переменные параметров, при этом изменения никак не влияют на переданные данные:

using System;

class Program
{
    static int Add(int x1, int x2)
    {
        x1 += x2; //изменение x1 не влияет на переданную в качестве аргумента переменную num1
        return x1;
    }

    static void Main(string[] args)
    {
        var num1 = 2;
        var num2 = 5;
        var sum = Add(num1, num2);

        Console.WriteLine($"{num1} + {num2} = {sum}");
        Console.ReadLine();
    }
}

Передача параметров по ссылке

Для передачи переменных по ссылке, используется модификатор ref. Если параметр обозначен ключевым словом ref, то любые изменения этого параметра в теле метода отражаются на переданной переменной:

using System;

class Program
{
    static int Mult(ref int x1, int x2)
    {
        x1 *= x2; //изменение x1 влияет на переменную n1
        return x1;
    }

    static void Main(string[] args)
    {
        var n1 = 24;
        var n2 = 4;
        var mult = Mult(ref n1, n2);
        //переменная n1 содержит новое значение
        Console.WriteLine($"{n1}");
        Console.ReadLine();
    }
}

Модификатор ref указывается как в описании, так и при вызове метода.

Выходные параметры

Выше рассмотренные параметры имеют название входные, поскольку передаются на вход метода. Кроме этого, в языке C#, есть выходные параметры. Для того, чтобы пометить параметр ка выходной, используется модификатор out.

Рассмотрим метод для деления двух чисел, он возвращает текст ошибки, если деление не возможно, а в качестве выходного параметра – результат операции:

using System;

class Program
{
    static string Div(int a, int b, out int result)
    {
        if (b == 0)
        {
            result = int.MinValue;
            return "Ошибка: Деление на ноль!";
        }
        else
        {
            result = a / b;
            return "";
        }
    }

    static void PrintResult(string errorText, int res)
    {
        if (string.IsNullOrEmpty(errorText))
        {
            Console.WriteLine(res);
        }
        else
        {
            Console.WriteLine(errorText);
        }
    }

    static void Main(string[] args)
    {
        int r1;
        var err1 = Div(64, 8, out r1);
        PrintResult(err1, r1);

        //переменная r2 объявляется в списке аргументов
        var err2 = Div(34, 0, out int r2); 
        PrintResult(err2, r2);

        Console.ReadLine();
    }
}

Именованные аргументы

В C# есть возможность передавать параметры в произвольном порядке, для этого используются именованные аргументы(named arguments). Для явного указания имени аргумента, используется следующий синтаксис:

arg_name : arg_value

Пример программы с именованными аргументами:

static string GetPrettyName(string firstName, string lastName)
{
    return firstName + " " + lastName;
}

static void Main(string[] args)
{
    var s = GetPrettyName(lastName: "Jackson", firstName: "Anna");
}

Опциональные параметры

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

Рассмотрим пример метода для вычисления процентов по банковскому депозиту. Обычная депозитная ставка 10%, кроме того, постоянные клиенты могут получить бонус:

static decimal CalcDeposit(decimal sum, decimal percent = 10m, decimal bonus = 0m)
{
    return sum + sum * ((percent + bonus) / 100m);
}

Пример использования:

//депозит со ставкой и бонусом по умолчанию
var d1 = CalcDeposit(10000); 
//бонус 2.5% (передается как именованный аргумент), ставка по умолчанию - 10%
var d2 = CalcDeposit(15000, bonus: 2.5m); 
//передаем все три аргумента
var d3 = CalcDeposit(20000, 15m, 3m); 

Необязательные параметры должны быть последними в списке аргументов метода.

Упрощенная запись методов

Начиная с C# 6.0, методы, в которых содержится всего одна инструкция, можно записывать в сокращенной форме посредством лямбда-выражений, это дает возможность сократить количество написанного кода.

К примеру, математическую функцию y = x2 - 2/x, можно записать:

static double Y(double x)
{
    return x * x - 2 / x;
}

Использовав лямбда-выражение, код будет иметь следующий вид:

static double Y(double x) => x * x - 2 / x;

Аналогичным образом можно упростить метод, который не возвращает значений:

static void DisplayHello(string n)
{
    Console.WriteLine("Привет {0}!", n);
}

Сокращается до:

static void DisplayHello(string n) => Console.WriteLine("Привет {0}!", n);

Локальные функции

Локальные функции

В версии C# 7.0, появилась возможность использовать методы вложенные в метод, такие конструкции носят название – локальные функции. Они поддерживают как классическую, так и упрощенную форму синтаксиса:

static void Main(string[] args)
{
    //максимальное из двух целых чисел
    int Max(int a, int b)
    {
        if (a > b)
            return a;
        return b;
    }
    
    // минимальное из двух целых чисел
    int Min(int c, int d) => c < d ? c : d;

    var t1 = Max(13, 22);
    var t2 = Min(42, 56);
}

Для всех рассмотренных методов используется модификатор static, поскольку предполагается их непосредственное использование в главном методе программы – Main.


Методы - это написанный код, который употребляется много раз (много раз вызывается).

И для упрощения кода программы, использование метода очень важно. Метод - это новое слово в языке Си Шарп, старое слово - это функция.

Методы логичны, если данный код выполняется более 2-х раз. 

Тогда проще объявить имя метода, какие значения он принимает, и написать код, который бы выпонялся правильно при всех значениях, которые принимает метод.

Для того, чтобы объявить методы в C#, необходимо написать следующее:

ТИП_ВОЗВРАЩАЕМОГО_ЗНАЧЕНИЯ ИМЯ_ФУНКЦИИ (ПЕРЕМЕННЫЕ) { КОД_МЕТОДА }

Если вам не нужно что-то возвращать, то можно писать в ТИП_ВОЗВРАЩАЕМОГО_ЗНАЧЕНИЯ - void.

 

Примеры:

1. Функция не возвращающая значения и не принимающая аргументы:

void printError()
{
     Console.Write("Error! Press Key...");
     Console.ReadKey();
}

2. Функция не возвращающая значения, но принимающая аргумент:

void printError(string s)
{
     Console.Write("Error! " + s + "Press Key...");
     Console.ReadKey();
}

3. Функция не возвращающая значения, но принимающая аргументы:

void printError(string s, int i)
{
     Console.Write("Error! " + s + " " + i + "Press Key...");
     Console.ReadKey();
}

3. Функция возвращающая значения, и принимающая аргументы:

char shifr(char x, int shifr)
{
     x = (char)(x + shifr);
     return x;
}

Вот пример программы, с применением методов: работа с методами...

 

Также к методу можно устанавливать уровень защиты: private, public.

К примеру:

private char shifr(char x, int shifr)
{
     x = (char)(x + shifr);
     return x;
}

public char shifr(char x, int shifr)
{
     x = (char)(x + shifr);
     return x;
}

Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...