Możesz użyć out kontekstowego słowa kluczowego w dwóch kontekstach (każdy jest linkiem do szczegółowych informacji), jako modyfikator parametru lub w deklaracjach parametrów typu ogólnego w interfejsach i delegatach. W tym temacie omówiono modyfikator parametrów, ale ten drugi temat zawiera informacje na temat deklaracji parametrów typu ogólnego.
Słowo outkluczowe powoduje przekazanie argumentów przez odwołanie. To jest jak refsłowo kluczowe, z tą różnicą, że refwymaga zainicjowania zmiennej przed jej przekazaniem. Aby użyć outparametru, zarówno definicja metody, jak i metoda wywołująca muszą jawnie używać outsłowa kluczowego. Na przykład: C #
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
Chociaż zmienne przekazane jako outargumenty nie muszą być inicjowane przed przekazaniem, wywoływana metoda jest wymagana do przypisania wartości przed jej zwróceniem.
Chociaż słowa kluczowe refi outpowodują różne zachowanie w czasie wykonywania, nie są one uważane za część sygnatury metody w czasie kompilacji. Dlatego metod nie można przeciążać, jeśli jedyną różnicą jest to, że jedna metoda przyjmuje refargument, a druga przyjmuje outargument. Na przykład następujący kod nie zostanie skompilowany: 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) { }
}
Przeciążenie można jednak wykonać, jeśli jedna metoda pobiera argument reflub, outa druga nie używa żadnego z nich, na przykład: C #
class OutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(out int i) { i = 5; }
}
Właściwości nie są zmiennymi i dlatego nie mogą być przekazywane jako outparametry.
Aby uzyskać informacje o przekazywaniu tablic, zobacz Przekazywanie tablic przy użyciu refiout (Podręcznik programowania w języku C #).
Nie można używać słów kluczowych refi outdo następujących rodzajów metod:
Async methods, which you define by using the async modifier.
Iterator methods, which include a yield return or yield break statement.
Przykład
Zadeklarowanie outmetody jest przydatne, gdy metoda ma zwracać wiele wartości. W poniższym przykładzie użyto outdo zwrócenia trzech zmiennych za pomocą pojedynczego wywołania metody. Zauważ, że trzeci argument jest przypisany do null. Umożliwia to metodom opcjonalne zwracanie wartości. DO#
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;
}
}
outnie może zostać odczytana przed przypisaniem do niej.refnie ma tego ograniczenia. Więc to jest to.