Вы можете использовать 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;
}
}
outне может быть прочитана до того, как она назначена.refне имеет этого ограничения. Вот и все.