Bildirim deyimleri

Bildirim deyimi yeni bir yerel değişken, yerel sabit veya yerel başvuru değişkeni bildirir. Bir yerel değişkeni bildirmek için türünü belirtin ve adını belirtin. Aşağıdaki örnekte gösterildiği gibi, bir deyimde aynı türde birden çok değişken bildirebilirsiniz:

string greeting;
int a, b, c;
List<double> xs;

Bildirim deyiminde, bir değişkeni ilk değeriyle de başlatabilirsiniz:

string greeting = "Hello";
int a = 3, b = 2, c = a + b;
List<double> xs = new();

Yukarıdaki örneklerde bir değişkenin türü açıkça belirtilir. Ayrıca derleyicinin başlatma ifadesinden bir değişkenin türünü çıkarmasına da izin vekleyebilirsiniz. Bunu yapmak için bir türün var adı yerine anahtar sözcüğünü kullanın. Daha fazla bilgi için Örtük olarak yazılan yerel değişkenler bölümüne bakın.

Yerel sabit bildirmek için aşağıdaki örnekte gösterildiği gibi anahtar sözcüğünü kullanınconst:

const string Greeting = "Hello";
const double MinLimit = -10.0, MaxLimit = -MinLimit;

Yerel bir sabit bildirdiğinizde, bunu da başlatmanız gerekir.

Yerel başvuru değişkenleri hakkında bilgi için Başvuru değişkenleri bölümüne bakın.

Örtük olarak yazılan yerel değişkenler

Yerel bir değişken bildirdiğinizde, derleyicinin başlatma ifadesinden değişkenin türünü çıkarmasına izin vekleyebilirsiniz. Bunu yapmak için türün var adı yerine anahtar sözcüğünü kullanın:

var greeting = "Hello";
Console.WriteLine(greeting.GetType());  // output: System.String

var a = 32;
Console.WriteLine(a.GetType());  // output: System.Int32

var xs = new List<double>();
Console.WriteLine(xs.GetType());  // output: System.Collections.Generic.List`1[System.Double]

Yukarıdaki örnekte gösterildiği gibi, örtük olarak yazılan yerel değişkenler kesin olarak yazılır.

Not

Etkin null atanabilir tanıma bağlamında kullandığınızda var ve başlatma ifadesinin türü bir başvuru türü olduğunda, başlatma ifadesinin türü null atanamaz olsa bile derleyici her zaman null atanabilir bir başvuru türü çıkartır.

bir oluşturucu çağırma ifadesi ile yaygın olarak kullanılırvar. kullanımı var , aşağıdaki örnekte gösterildiği gibi bir değişken bildiriminde ve nesne örneği oluşturmada tür adını yinelememenizi sağlar:

var xs = new List<int>();

Alternatif olarak hedef türündeki new ifadeyi kullanabilirsiniz:

List<int> xs = new();
List<int>? ys = new();

Anonim türlerle çalışırken, örtük olarak yazılan yerel değişkenleri kullanmanız gerekir. Aşağıdaki örnekte, müşterinin adını ve telefon numarasını tutmak için anonim bir tür kullanan sorgu ifadesi gösterilmektedir:

var fromPhoenix = from cust in customers
                  where cust.City == "Phoenix"
                  select new { cust.Name, cust.Phone };

foreach (var customer in fromPhoenix)
{
    Console.WriteLine($"Name={customer.Name}, Phone={customer.Phone}");
}

Yukarıdaki örnekte değişkenin türünü fromPhoenix açıkça belirtemezsiniz. Tür ancak IEnumerable<T> bu durumda T anonim bir türdür ve adını sağlayamazsınız. Bu nedenle kullanmanız vargerekir. Aynı nedenle, deyiminde foreach yineleme değişkenini customer bildirirken kullanmanız var gerekir.

Örtük olarak yazılan yerel değişkenler hakkında daha fazla bilgi için bkz . Örtük olarak yazılan yerel değişkenler.

Desen eşleştirmede var anahtar sözcüğü bir var desende kullanılır.

Başvuru değişkenleri

Bir yerel değişken bildirdiğinizde ve değişkenin türünden ref önce anahtar sözcüğünü eklediğinizde, bir başvuru değişkeni veya yerel bir ref değişken bildirirsiniz:

ref int aliasOfvariable = ref variable;

Başvuru değişkeni, başvuran olarak adlandırılan başka bir değişkene başvuran bir değişkendir. Diğer bir ifadeyle, başvuru değişkeni, başvuranı için bir diğer addır . Bir başvuru değişkenine değer atadığınızda, bu değer başvurana atanır. Bir başvuru değişkeninin değerini okuduğunuzda, başvuranın değeri döndürülür. Aşağıdaki örnekte bu davranış gösterilmektedir:

int a = 1;
ref int aliasOfa = ref a;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})");  // output: (a, aliasOfa) is (1, 1)

a = 2;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})");  // output: (a, aliasOfa) is (2, 2)

aliasOfa = 3;
Console.WriteLine($"(a, aliasOfa) is ({a}, {aliasOfa})");  // output: (a, aliasOfa) is (3, 3)

ref Aşağıdaki örnekte gösterildiği gibi bir başvuru değişkeninin başvuruyu değiştirmek için atama işlecini= ref kullanın:

void Display(int[] s) => Console.WriteLine(string.Join(" ", s));

int[] xs = [0, 0, 0];
Display(xs);

ref int element = ref xs[0];
element = 1;
Display(xs);

element = ref xs[^1];
element = 3;
Display(xs);
// Output:
// 0 0 0
// 1 0 0
// 1 0 3

Yukarıdaki örnekte, element başvuru değişkeni ilk dizi öğesinin diğer adı olarak başlatılır. ref Ardından son dizi öğesine başvurmak için yeniden atanır.

Yerel değişken ref readonly tanımlayabilirsiniz. Değişkene ref readonly değer atayamazsınız. Ancak, aşağıdaki örnekte gösterildiği gibi böyle bir başvuru değişkenini yeniden atayabilirsiniz ref :

int[] xs = [1, 2, 3];

ref readonly int element = ref xs[0];
// element = 100;  error CS0131: The left-hand side of an assignment must be a variable, property or indexer
Console.WriteLine(element);  // output: 1

element = ref xs[^1];
Console.WriteLine(element);  // output: 3

Aşağıdaki örnekte gösterildiği gibi bir başvuru değişkenine başvuru dönüşü atayabilirsiniz:

using System;

public class NumberStore
{
    private readonly int[] numbers = [1, 30, 7, 1557, 381, 63, 1027, 2550, 511, 1023];

    public ref int GetReferenceToMax()
    {
        ref int max = ref numbers[0];
        for (int i = 1; i < numbers.Length; i++)
        {
            if (numbers[i] > max)
            {
                max = ref numbers[i];
            }
        }
        return ref max;
    }

    public override string ToString() => string.Join(" ", numbers);
}

public static class ReferenceReturnExample
{
    public static void Run()
    {
        var store = new NumberStore();
        Console.WriteLine($"Original sequence: {store.ToString()}");
        
        ref int max = ref store.GetReferenceToMax();
        max = 0;
        Console.WriteLine($"Updated sequence:  {store.ToString()}");
        // Output:
        // Original sequence: 1 30 7 1557 381 63 1027 2550 511 1023
        // Updated sequence:  1 30 7 1557 381 63 1027 0 511 1023
    }
}

Yukarıdaki örnekte yöntemi, GetReferenceToMax başv yöntemidir. En büyük değerin kendisini döndürmez, ancak en yüksek değeri tutan dizi öğesinin diğer adı olan bir başvuru döndürür. yöntemi, Run başvuru değişkenine max bir başvuru dönüşü atar. Ardından, öğesine maxatayarak örneğin iç depolama alanını store güncelleştirir. Bir yöntem de tanımlayabilirsiniz ref readonly . Bir ref readonly yöntemin çağıranları, başvuru dönüşlerine bir değer atayamaz.

deyiminin foreach yineleme değişkeni bir başvuru değişkeni olabilir. Daha fazla bilgi için Yineleme deyimleri makalesinin deyim bölümüne bakınforeach.

Performans açısından kritik senaryolarda, potansiyel olarak pahalı kopyalama işlemlerinden kaçınarak başvuru değişkenlerinin ve getirilerinin kullanımı performansı artırabilir.

Derleyici, bir başvuru değişkeninin başvurudan daha uzun yaşamamasını ve yaşam süresi boyunca geçerli kalmasını sağlar. Daha fazla bilgi için C# dil belirtiminin Başvuru güvenli bağlamlar bölümüne bakın.

Alanlar hakkında ref bilgi için yapı türleri makalesininrefalanlar bölümüne bakınref.

kapsamlı başvuru

Bağlamsal anahtar sözcük scoped , bir değerin ömrünü kısıtlar. scoped Değiştirici, sırasıyla ref-safe-to-escape veya safe-to-escape ömrünü geçerli yöntemle kısıtlar. Etkili bir şekilde değiştirici eklendiğinde scoped kodunuzun değişkenin ömrünü uzatmayacağından emin olursunuz.

Bir parametreye veya yerel değişkene uygulayabilirsiniz scoped . Değiştirici, scoped türü bir ref structolduğunda parametrelere ve yerel ayarlara uygulanabilir. Aksi takdirde, scoped değiştirici yalnızca yerel başvuru değişkenlerine uygulanabilir. Bu, değiştirici ile ref bildirilen yerel değişkenleri ve ile inref bildirilen parametreleri veya out değiştiricileri içerir.

Değiştiriciscoped, türü ref structbir structolduğunda , out parametreleri ve ref parametrelerinde bildirilen yöntemlere örtük olarak eklenirthis.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:

Değiştirici hakkında scoped daha fazla bilgi için Düşük düzeyli yapı geliştirmeleri teklif notu'na bakın.

Ayrıca bkz.