Вы можете использовать контекстное ключевое слово out
в двух контекстах (каждый является ссылкой на подробную информацию), в качестве модификатора параметра или в объявлениях параметров общего типа в интерфейсах и делегатах. В этом разделе обсуждается модификатор параметра, но вы можете посмотреть этот другой раздел для получения информации о объявлениях параметров универсального типа.
Ключевое слово out
вызывает передачу аргументов по ссылке. Это похоже на ключевое слово ref
, за исключением того, что ref
требует инициализации переменной перед ее передачей. Чтобы использовать параметр out
, как определение метода, так и вызывающий метод должны явно использовать ключевое слово out
. Например:
C #
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
Хотя переменные, переданные как out
аргументы, не нужно инициализировать перед передачей, вызываемый метод должен присвоить значение, прежде чем метод вернется.
Хотя ключевые слова ref
и out
вызывают различное поведение во время выполнения, они не считаются частью сигнатуры метода во время компиляции. Поэтому методы не могут быть перегружены, если единственное отличие состоит в том, что один метод принимает аргумент ref
, а другой - аргумент out
. Например, следующий код не будет компилироваться:
C #
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}
Перегрузка может быть выполнена, однако, если один метод принимает аргумент ref
или out
, а другой не использует ни один, например так:
C #
class OutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(out int i) { i = 5; }
}
Свойства не являются переменными и поэтому не могут быть переданы как out
параметры.
Сведения о передаче массивов см. В разделе «Передача массивов с использованием ref
и out
» (Руководство по программированию в C #).
Вы не можете использовать ключевые слова ref
и out
для следующих методов:
Async methods, which you define by using the async modifier.
Iterator methods, which include a yield return or yield break statement.
Пример
Объявление метода out
полезно, если вы хотите, чтобы метод возвращал несколько значений. В следующем примере out
используется для возврата трех переменных за один вызов метода. Обратите внимание, что третий аргумент назначен на ноль. Это позволяет методам возвращать значения по желанию.
C #
class OutReturnExample
{
static void Method(out int i, out string s1, out string s2)
{
i = 44;
s1 = "I've been returned";
s2 = null;
}
static void Main()
{
int value;
string str1, str2;
Method(out value, out str1, out str2);
// value is now 44
// str1 is now "I've been returned"
// str2 is (still) null;
}
}