Выходной параметр в С#
В этой статье представлены новые возможности параметра out в C# 7.0. Выходной параметр C# используется, когда метод возвращает несколько значений. Когда параметр передается с ключевым словом/параметром Out в методе, этот метод работает с тем же значением переменной, которое передается при вызове метода. Если значение переменной изменяется, значение параметра метода также изменяется.
Есть некоторые дополнительные возможности параметра C# Out
- Выходной параметр может проходить без его объявления и инициализации.
- Выходной параметр может использовать тип var в списке параметров метода.
- Не обязательно, чтобы имя параметра Out было одинаковым как в определении функции, так и в вызове.
В этой статье на примерах рассказывается об улучшенных возможностях параметра Out. Итак, давайте посмотрим каждый по одному.
Встроенное объявление параметра Out
В более ранних версиях C# нам нужно было бы разделить объявление и инициализацию переменной Out на два разных оператора. C# 7.0 предоставляет эту функцию, которую параметр Out может передавать без его объявления и инициализации. Давайте посмотрим пример.
using System;
using static System.Console;
namespace OutExample
{
class Program
{
static void Main(string[] args)
{
WriteLine("Please enter radious for circle");
double radious = Convert.ToDouble(ReadLine());
double circumference = CalculateCircle(radious, out double area);
WriteLine($"Circle's circumference is {circumference}");
WriteLine($"Circle's Area is {area}");
ReadKey();
}
static double CalculateCircle(double radious, out double area)
{
area = Math.PI * Math.Pow(radious, 2);
double circumference = 2 * Math.PI * radious;
return circumference;
}
}
}
Теперь запустите эту программу. Результат показан на следующем рисунке.
Этот код показывает следующие особенности параметра Out.
- Метод может иметь один или несколько параметров Out.
- При использовании метода с параметром Out вам не нужно объявлять и инициализировать этот параметр Out раньше.
double circumference = CalculateCircle(radious, out double area);
- Параметр Out может быть объявлен встроенным во время вызова метода, например параметр области.
- Доступ к объявленному в строке параметру Out можно получить в том же блоке. Его область действия находится в методе, который он вызывает.
- Вызываемый метод должен присвоить значение параметру Out перед возвратом из метода.
- Метод может быть перегружен на основе параметров Out.
- Асинхронные методы не имеют параметра out.
- Методы итератора не имеют параметра out.
Параметр неявного типа
Как показано в примере, параметр Out объявляется с указанием типа в списке параметров для ясности. Однако язык поддерживает использование неявно типизированной локальной переменной. Тип данных переменной var будет определяться при присвоении значения переменной. После присвоения значения переменной переменная имеет определенный тип данных и не может быть заменена.
Поскольку переменная типа var имеет локальную область видимости (имеется в виду область видимости в теле метода), аналогичным образом встроенный параметр Out имеет область видимости в теле метода, поэтому тип var также можно использовать в качестве параметра Out.
Давайте создадим пример. Найдите длину самого длинного подмассива, содержащего числа, которые можно расположить в непрерывной последовательности из целочисленного массива.
using static System.Console;
namespace OutExample
{
class Program
{
static void Main(string[] args)
{
int [] arr = { 1, 56, 58, 57, 90, 92, 94, 93, 91, 45 };
int n = arr.Length;
findLength(arr, n, out var maxlenth);
WriteLine($"Length of the longest contiguous subarray is {maxlenth}");
ReadKey();
}
static void findLength(int []arr, int n, out int maxlength)
{
maxlength = 1;
for (int i = 0; i < n - 1; i++)
{
int mn = arr[i], mx = arr[i];
for (int j = i + 1; j < n; j++)
{
mn = min(mn, arr[j]);
mx = max(mx, arr[j]);
if ((mx - mn) == j - i)
{
maxlength = max(maxlength, mx - mn + 1);
}
}
}
}
static int min(int x, int y)
{
return (x < y) ? x : y;
}
static int max(int x, int y)
{
return (x > y) ? x : y;
}
}
}
Теперь запустите эту программу. Результат показан на следующем рисунке.
Как показано в приведенной выше программе, параметр out может быть неявного типа.
Использовать в пробном шаблоне
Параметр Out в основном используется в шаблоне Try. В этом шаблоне метод возвращает логическое значение, указывающее на успех или неудачу, и переменную Out, которая предоставляет результат в случае успешного выполнения метода. Давайте посмотрим на пример для того же. В этом примере показано, что пользователь вводит значение. Если значение является допустимым целым числом, то оно показывает результат.
using static System.Console;
namespace OutExample
{
class Program
{
static void Main(string[] args)
{
WriteLine("Please enter you age");
bool isValid = int.TryParse(ReadLine(), out int age);
string message = isValid ? $"You are {age} Years old" : "Please enter valid age";
WriteLine(message);
ReadKey();
}
}
}
Как показано в приведенном выше коде, метод шаблона try присваивает значение параметру Out в случае успеха. Теперь запустите эту программу, и результат будет показан на следующем рисунке.
Заключение
Функции параметра Out улучшены в C# 7.0. Как встроенное, так и неявное объявление типов являются новыми в этой новой версии.