out parametresi değiştiricisi (C# Başvurusu)out parameter modifier (C# Reference)

Anahtar out kelime bağımsız değişkenlerin başvuruyla geçirilmesine neden olur.The out keyword causes arguments to be passed by reference. Bu, resmi parametreyi bağımsız değişken için bir diğer ad yapar, bu da bir değişken olmalıdır.It makes the formal parameter an alias for the argument, which must be a variable. Başka bir deyişle, parametre üzerinde herhangi bir işlem bağımsız değişken üzerinde yapılır.In other words, any operation on the parameter is made on the argument. Bu ref anahtar kelime gibi, ref ancak bu değişken geçirilmeden önce başlatılmasını gerektirir.It is like the ref keyword, except that ref requires that the variable be initialized before it is passed. Ayrıca anahtar kelime gibi, ancak in bu çağrılan yöntem bağımsız değişken değerini değiştirmek için izin vermez.It is also like the in keyword, except that in does not allow the called method to modify the argument value. Bir out parametre kullanmak için hem yöntem tanımı hem de out arama yönteminin anahtar sözcüğü açıkça kullanması gerekir.To use an out parameter, both the method definition and the calling method must explicitly use the out keyword. Örnek:For example:

int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);     // value is now 44

void OutArgExample(out int number)
{
    number = 44;
}

Not

out Anahtar kelime, tür parametresinin ortak olduğunu belirtmek için genel bir tür parametresi ile de kullanılabilir.The out keyword can also be used with a generic type parameter to specify that the type parameter is covariant. Bu bağlamda out anahtar kelimenin kullanımı hakkında daha fazla bilgi için bkz. out (Generic Modifier)For more information on the use of the out keyword in this context, see out (Generic Modifier).

Bağımsız değişkenler out olarak geçirilen değişkenlerin bir yöntem çağrısında geçirilmeden önce başlatılması gerekmez.Variables passed as out arguments do not have to be initialized before being passed in a method call. Ancak, yöntem dönmeden önce bir değer atamak için çağrılan yöntem gereklidir.However, the called method is required to assign a value before the method returns.

, in refve out anahtar kelimeler aşırı yük çözümlemesi amacıyla yöntem imzasının bir parçası olarak kabul edilmez.The in, ref, and out keywords are not considered part of the method signature for the purpose of overload resolution. Bu nedenle, tek fark bir yöntemin bir ref bağımsız in değişken ilerlerken out diğerinin bir bağımsız değişken almasıysa, yöntemler aşırı yüklenemez.Therefore, methods cannot be overloaded if the only difference is that one method takes a ref or in argument and the other takes an out argument. Örneğin, aşağıdaki kod derlenilmeyecektir:The following code, for example, will not compile:

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) { }
}

Aşırı yükleme yasal, ancak, bir refyöntem inalır out , , veya argüman ve diğer bu gibi bu değiştiriciler hiçbiri vardır:Overloading is legal, however, if one method takes a ref, in, or out argument and the other has none of those modifiers, like this:

class OutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(out int i) => i = 5;
}

Derleyici, çağrı yerindeki parametre değiştiricilerini yöntem çağrısında kullanılan parametre değiştiricileriyle eşleştirerek en iyi aşırı yüklemeyi seçer.The compiler chooses the best overload by matching the parameter modifiers at the call site to the parameter modifiers used in the method call.

Özellikler değişken değildir ve bu nedenle out parametre olarak geçirilemez.Properties are not variables and therefore cannot be passed as out parameters.

Aşağıdaki yöntem türleri iniçin ref, out ve anahtar kelimeleri kullanamazsınız:You can't use the in, ref, and out keywords for the following kinds of methods:

  • Async değiştirici kullanarak tanımladığınız async yöntemleri.Async methods, which you define by using the async modifier.

  • Verim getirisi veya yield break deyimi içeren yineleyici yöntemleri.Iterator methods, which include a yield return or yield break statement.

Buna ek olarak, uzantı yöntemleri aşağıdaki kısıtlamalara sahiptir:In addition, extension methods have the following restrictions:

  • Keywoard out bir uzantı yönteminin ilk bağımsız değişkeninde kullanılamaz.The out keywoard cannot be used on the first argument of an extension method.
  • Anahtar ref kelime, bağımsız değişken bir yapı olmadığında veya yapı olarak sınırlandırılmamış genel bir tür olduğunda, uzantı yönteminin ilk bağımsız değişkeninde kullanılamaz.The ref keyword cannot be used on the first argument of an extension method when the argument is not a struct, or a generic type not constrained to be a struct.
  • İlk in bağımsız değişken bir yapı olmadığı sürece anahtar sözcük kullanılamaz.The in keyword cannot be used unless the first argument is a struct. Anahtar in kelime, yapı olarak sınırlandırılsa bile, herhangi bir genel türde kullanılamaz.The in keyword cannot be used on any generic type, even when constrained to be a struct.

Parametreleri out bildirmeDeclaring out parameters

Bağımsız değişkenlerle out bir yöntem bildirmek, birden çok değer döndürmek için klasik bir geçici çözümdür.Declaring a method with out arguments is a classic workaround to return multiple values. C# 7.0 ile başlayarak, benzer senaryolar için tuples düşünün.Beginning with C# 7.0, consider tuples for similar scenarios. Aşağıdaki örnekte, out tek bir yöntem çağrısıyla üç değişken iThe following example uses out to return three variables with a single method call. Üçüncü bağımsız değişkenin null olarak atandığını unutmayın.Note that the third argument is assigned to null. Bu, yöntemlerin değerleri isteğe bağlı olarak döndürmesini sağlar.This enables methods to return values optionally.

void Method(out int answer, out string message, out string stillNull)
{
    answer = 44;
    message = "I've been returned";
    stillNull = null;
}

int argNumber;
string argMessage, argDefault;
Method(out argNumber, out argMessage, out argDefault);
Console.WriteLine(argNumber);
Console.WriteLine(argMessage);
Console.WriteLine(argDefault == null);

// The example displays the following output:
//      44
//      I've been returned
//      True

Bir yöntemi out bağımsız değişkenle çağırmaCalling a method with an out argument

C# 6 ve daha önce, bir değişkeni bağımsız değişken olarak out geçirmeden önce ayrı bir ifadede bildirmeniz gerekir.In C# 6 and earlier, you must declare a variable in a separate statement before you pass it as an out argument. Aşağıdaki örnek, bir dizeyi bir sayıya dönüştürmeyi amaçlayan number Int32.TryParse yöntemine geçirilmeden önce adlı bir değişkeni bildirir.The following example declares a variable named number before it is passed to the Int32.TryParse method, which attempts to convert a string to a number.

string numberAsString = "1640";

int number;
if (Int32.TryParse(numberAsString, out number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

C# 7.0 ile başlayarak, out değişkeni ayrı bir değişken bildirimi yerine yöntem çağrısının bağımsız değişken listesinde bildirebilirsiniz.Starting with C# 7.0, you can declare the out variable in the argument list of the method call, rather than in a separate variable declaration. Bu, daha kompakt, okunabilir kod üretir ve yöntem çağrısından önce değişkene yanlışlıkla bir değer atamanızı engeller.This produces more compact, readable code, and also prevents you from inadvertently assigning a value to the variable before the method call. Aşağıdaki örnek, Int32.TryParse number yöntemine yapılan çağrıdaki değişkeni tanımlaması dışında önceki örnekteki gibidir.The following example is like the previous example, except that it defines the number variable in the call to the Int32.TryParse method.

string numberAsString = "1640";

if (Int32.TryParse(numberAsString, out int number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

Önceki örnekte, number değişken güçlü bir şekilde int.In the previous example, the number variable is strongly typed as an int. Aşağıdaki örnekte olduğu gibi, örtülü olarak yazılan yerel değişkeni de bildirebilirsiniz.You can also declare an implicitly typed local variable, as the following example does.

string numberAsString = "1640";

if (Int32.TryParse(numberAsString, out var number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

C# Dil BelirtimiC# Language Specification

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi.For more information, see the C# Language Specification. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.The language specification is the definitive source for C# syntax and usage.

Ayrıca bkz.See also