Методы (Руководство по программированию на C#)

Метод представляет собой блок кода, содержащий набор инструкций. Программа инициирует выполнение операторов, вызывая метод и задавая необходимые аргументы метода. В C# все инструкции выполняются в контексте метода. Метод Main является точкой входа для каждого приложения C#, и вызывается он средой CLR при запуске программы.

Примечание

В этом разделе описываются именованные методы.Дополнительные сведения об анонимных функциях см. в разделе Анонимные функции (Руководство по программированию на C#).

Сигнатуры метода

Методы объявляются в классе или в структуре путем указания уровня доступа, например public или private, необязательных модификаторов, например abstract или sealed, возвращаемого значения, имени метода и списка параметров этого метода. Все вместе эти элементы образуют сигнатуру метода.

Примечание

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

Параметры заключаются в круглые скобки и разделяются запятыми. Пустые скобки указывают на то, что у метода нет параметров. Следующий класс содержит три метода.

abstract class Motorcycle
{
    // Anyone can call this. 
    public void StartEngine() {/* Method statements here */ }

    // Only derived classes can call this. 
    protected void AddGas(int gallons) { /* Method statements here */ }

    // Derived classes can override the base class implementation. 
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }

    // Derived classes must implement this. 
    public abstract double GetTopSpeed(); 
}

Доступ к методам

Вызов метода объекта очень похож на обращение к полю. После имени объекта ставится точка, затем имя метода и скобки. В скобках перечисляются аргументы, разделенные запятыми. Таким образом, методы класса Motorcycle можно вызывать так, как показано в следующем примере.

class TestMotorcycle : Motorcycle
{

    public override double GetTopSpeed()
    {
        return 108.4;
    }

    static void Main()
    {

        TestMotorcycle moto = new TestMotorcycle();

        moto.StartEngine();
        moto.AddGas(15);
        moto.Drive(5, 20);
        double speed = moto.GetTopSpeed();
        Console.WriteLine("My top speed is {0}", speed);            
    }
}

Параметры методов ДЛЯ. аргументов

Определение метода задает имена и типы любых необходимых параметров. Когда код вызова вызывает метод, он предоставляет конкретные значения, называемые аргументами, для каждого параметра. Аргументы должны быть совместимыми с типом параметра, но имя аргумента (если таковое имеется), используемое в коде вызова, не обязательно должно совпадать с именем параметра, определенного в методе. Например:

public void Caller()
{
    int numA = 4;
    // Call with an int variable. 
    int productA = Square(numA);

    int numB = 32;
    // Call with another int variable. 
    int productB = Square(numB);

    // Call with an integer literal. 
    int productC = Square(12);

    // Call with an expression that evaulates to int.
    productC = Square(productA * 3);
}

int Square(int i)
{
    // Store input argument in a local variable. 
    int input = i;
    return input * input;
}

Передача по ссылке И. передача по значению

По умолчанию при передаче методу типа значения передается копия объекта, а не сам объект. Поэтому изменения в аргументе не оказывают влияния на исходную копию в вызывающем методе. Тип значения по ссылке можно передать с помощью ключевого слова ref. Дополнительные сведения см. в разделе Передача параметров типа значения (Руководство по программированию в C#). Полный список встроенных типов значений см. в разделе Таблица типов значений (Справочник по C#).

Когда объект ссылочного типа передается методу, ссылка на этот объект передается. То есть метод возвращает не сам объект но аргумент, который показывает расположения объекта. При изменении членом объекта с помощью этой ссылки, то автоматически устанавливатьо изменение в аргументе в вызывающем методе, даже если передается объект значением.

Создании ссылочный тип с помощью ключевого слова class, как показано в следующем примере.

public class SampleRefType
{
    public int value;
}

Теперь, при передаче объекта, который основан на данном типе методу передается ссылка на объект. В следующем примере передает объект типа SampleRefType методу ModifyObject.

public static void TestRefType()
{
    SampleRefType rt = new SampleRefType();
    rt.value = 44;
    ModifyObject(rt);
    Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
    obj.value = 33;
}

Примере выполняются по сути то же самое, что и предыдущий пример, в котором он передает аргумент по значению к методу. Но, поскольку ссылочный тип используется результат отличается. Изменение, выполненное в ModifyObject к полю value параметра, obj, также изменяется поле value аргумента, rt в методе TestRefType. Метод TestRefType отображает 33 как output.

Дополнительные сведения о том, как передавать ссылочные типы по ссылке и значением см. в разделе Передача параметров ссылочного типа (Руководство по программированию в C#) и Ссылочные типы (Справочник по C#).

Возвращаемые значения

Методы могут возвращать значения вызывающим их объектам. Если тип возвращаемого значения, указываемый перед именем метода, не равен void, для возвращения значения используется ключевое слово return. В результате выполнения инструкции с ключевым словом return, после которого указано значение нужного типа, вызвавшему метод объекту будет возвращено это значение. Кроме того, ключевое слово return останавливает выполнение метода. Если тип возвращаемого значения void, инструкцию return без значения все равно можно использовать для завершения выполнения метода. Если ключевое слово return отсутствует, выполнение метода завершится, когда будет достигнут конец его блока кода. Для возврата значений методами с типом возвращаемого значения отличным от void необходимо обязательно использовать ключевое слово return. Например, в следующих двух методах ключевое слово return служит для возврата целочисленных значений.

class SimpleMath
{
    public int AddTwoNumbers(int number1, int number2)
    {
        return number1 + number2;
    }

    public int SquareANumber(int number)
    {
        return number * number;
    }
}

Чтобы использовать возвращаемое методом значение в вызываемом методе, вызов метода можно поместить в любое место кода, где требуется значение соответствующего типа. Кроме того, возвращаемое значение можно присвоить переменной. Например, следующие два примера кода выполняют одну и ту же задачу.

int result = obj.AddTwoNumbers(1, 2);
result = obj.SquareANumber(result);
// The result is 9.
Console.WriteLine(result);
result = obj.SquareANumber(obj.AddTwoNumbers(1, 2));
// The result is 9.
Console.WriteLine(result);

Использование локальной переменной в этом случае result, хранение значение является необязательным. Эта переменная может упростить читаемость кода либо быть необходимой, если необходимо сохранить исходное значение аргумента для целой области метода.

Дополнительные сведения см. в разделе return (Справочник по C#).

Методы Async

Async с помощью функции можно вызывать асинхронные методы без использования явных обратных вызовов или вручную разделить ваш код через несколько методов или лямбда-выражения. Async - функция Visual Studio 2012 введены.

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

Примечание

Метод асинхронного возвращает вызывающему объекту, если оно обнаруживает сначала подожданный объект, который еще не завершен или получении в конец метода async, каким бы no из этих условий выполняется первым.

Метод асинхронного может иметь тип возвращаемого значения Task, Task или свободного места. Возвращаемый тип void используется в основном для указания обработчики событий, где возвращаемый тип void требуется. Async метода, который не возвращает значения нельзя подождать, а вызывающий объект свободн- возвращая метода не может перехватывать исключения, метод создает исключение.

В следующем примере DelayAsync метод async, который имеет тип возврата Task. DelayAsync имеет выписку return, возвращается целое число. Поэтому объявление метода DelayAsync должно иметь тип возвращаемого значения Task<int>. Поскольку возвращаемый тип Task<int>, вычисление выражения await в DoSomethingAsync создает целое число, как показано в следующей оператор: int result = await delayTask.

Метод startButton_Click async - пример метода, который имеет возвращаемый тип void. Поскольку метод DoSomethingAsync async, задачи для вызова DoSomethingAsync необходимо подождать, как показано в следующей выписку: await DoSomethingAsync();. Метод startButton_Click должно быть указано с модификатором async поскольку метод содержит выражение await.

// using System.Diagnostics; 
// using System.Threading.Tasks; 

// This Click event is marked with the async modifier. 
private async void startButton_Click(object sender, RoutedEventArgs e)
{
    await DoSomethingAsync();
}

private async Task DoSomethingAsync()
{
    Task<int> delayTask = DelayAsync();
    int result = await delayTask;

    // The previous two statements may be combined into 
    // the following statement. 
    //int result = await DelayAsync();

    Debug.WriteLine("Result: " + result);
}

private async Task<int> DelayAsync()
{
    await Task.Delay(100);
    return 5;
}

// Output: 
//  Result: 5

Метод асинхронного не может объявлять все параметры ref или out, но он может вызвать методы, которые имеют такие параметры.

Дополнительные сведения о методах async см. в разделе Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic), Поток управления в асинхронных программах (C# и Visual Basic) и Асинхронные типы возвращаемых значений (C# и Visual Basic).

Итераторы

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

Итератор можно вызывать из кода клиента с использованием выписки foreach.

Возвращаемый тип итератора может быть IEnumerable, IEnumerable, IEnumerator или IEnumerator.

Дополнительные сведения см. в разделе Итераторы (C# и Visual Basic).

Спецификация языка C#

Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Классы и структуры (Руководство по программированию в C#)

Модификаторы доступа (Руководство по программированию в C#)

Статические классы и члены статических классов (Руководство по программированию в C#)

Наследование (Руководство по программированию на C#)

Абстрактные и запечатанные классы и члены классов (Руководство по программированию на C#)

params (справочник по C#)

return (Справочник по C#)

out (Справочник по C#)

ref (Справочник по C#)

Передача параметров (Руководство по программированию в C#)

Основные понятия

Руководство по программированию на C#