readonly (C# Başvurusu)

readonly anahtar sözcüğü beş bağlamda kullanılabilecek bir değiştiricidir:

  • Alan bildiriminde, readonly alana atamanın yalnızca bildirimin bir parçası olarak veya aynı sınıftaki bir oluşturucuda gerçekleşebileceğini gösterir. Salt okunur bir alan, alan bildirimi ve oluşturucu içinde birden çok kez atanabilir ve yeniden atanabilir.

    readonly Oluşturucu çıktıktan sonra alan atanamaz. Bu kuralın değer türleri ve başvuru türleri için farklı etkileri vardır:

    • Değer türleri doğrudan verilerini içerdiği için, değer türü olan bir readonly alan sabittir.
    • Başvuru türleri verilerine başvuru içerdiğinden, başvuru türü olan bir readonly alan her zaman aynı nesneye başvurmalıdır. Bu nesne sabit olmayabilir. Değiştirici, readonly alan değerinin başvuru türünün farklı bir örneğiyle değiştirilmesini engeller. Ancak değiştirici, alanın örnek verilerinin salt okunur alan aracılığıyla değiştirilmesini engellemez.

    Uyarı

    Değiştirilebilir başvuru türü olan dışarıdan görünür salt okunur bir alan içeren dışarıdan görünür bir tür bir güvenlik açığı olabilir ve CA2104 uyarısını tetikleyebilir: "Salt okunur değiştirilebilir başvuru türlerini bildirme."

  • Tür readonly struct tanımında, readonly yapı türünün sabit olduğunu gösterir. Daha fazla bilgi için Yapı türleri makalesinin yapı bölümüne bakınreadonly.

  • Bir yapı türü içindeki örnek üye bildiriminde, readonly örnek üyesinin yapının durumunu değiştirmediğini gösterir. Daha fazla bilgi için Yapı türleri makalesinin örnek üyeleri bölümüne bakınreadonly.

  • Bir ref readonly yöntem döndürücüsunda readonlydeğiştirici, yöntemin bir başvuru döndürdüğünü ve bu başvuruya yazmalara izin verilmediğini gösterir.

Salt okunur alan örneği

Bu örnekte, sınıf oluşturucusunda bir değer atanmış olsa bile, yönteminde alanının year değeri değiştirilemez ChangeYear:

class Age
{
    private readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    void ChangeYear()
    {
        //_year = 1967; // Compile error if uncommented.
    }
}

Alana yalnızca aşağıdaki bağlamlarda bir readonly değer atayabilirsiniz:

  • Değişken bildirimde başlatıldığında, örneğin:

    public readonly int y = 5;
    
  • Örnek alanı bildirimini içeren sınıfının örnek oluşturucusunda.

  • Statik alan bildirimini içeren sınıfın statik oluşturucusunda.

Bu oluşturucu bağlamları aynı zamanda bir readonly alanı out veya ref parametresi olarak geçirmek için geçerli olan tek bağlamlardır.

Not

anahtar readonly sözcüğü const anahtar sözcüğünden farklıdır. Bir const alan yalnızca alanın bildiriminde başlatılabilir. Bir readonly alan, alan bildiriminde ve herhangi bir oluşturucuda birden çok kez atanabilir. Bu nedenle, readonly kullanılan oluşturucuya bağlı olarak alanlar farklı değerlere sahip olabilir. Ayrıca, bir const alan bir derleme zamanı sabiti olsa da, readonly aşağıdaki örnekte olduğu gibi çalışma zamanı sabitleri için kullanılabilir:

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
public class SamplePoint
{
    public int x;
    // Initialize a readonly field
    public readonly int y = 25;
    public readonly int z;

    public SamplePoint()
    {
        // Initialize a readonly instance field
        z = 24;
    }

    public SamplePoint(int p1, int p2, int p3)
    {
        x = p1;
        y = p2;
        z = p3;
    }

    public static void Main()
    {
        SamplePoint p1 = new SamplePoint(11, 21, 32);   // OK
        Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
        SamplePoint p2 = new SamplePoint();
        p2.x = 55;   // OK
        Console.WriteLine($"p2: x={p2.x}, y={p2.y}, z={p2.z}");
    }
    /*
     Output:
        p1: x=11, y=21, z=32
        p2: x=55, y=25, z=24
    */
}

Yukarıdaki örnekte, aşağıdaki örnekte olduğu gibi bir deyim kullanıyorsanız:

p2.y = 66;        // Error

derleyici hata iletisini alırsınız:

Salt okunur alan atanamaz (oluşturucu veya değişken başlatıcı dışında)

Salt okunur örnek üyeleri

Bir örnek üyesinin readonly yapı durumunu değiştirmediğini bildirmek için değiştiriciyi de kullanabilirsiniz.

public readonly double Sum()
{
    return X + Y;
}

Not

Okuma/yazma özelliği söz konusu olduğunda, değiştiriciyi readonly erişimciye get ekleyebilirsiniz. Bazı get erişimciler, yalnızca özel bir alanın değerini döndürmek yerine hesaplama yapabilir ve sonucu önbelleğe alabilir. Değiştiriciyi readonly erişimciye get eklemek, erişimcinin get herhangi bir sonucu önbelleğe alarak nesnenin iç durumunu değiştirmediğini garanti eder.

Yapı türleri makalesinin readonly örnek üyeleri bölümünde daha fazla örnek bulabilirsiniz.

Ref readonly return örneği

üzerindeki readonlyref return değiştirici, döndürülen başvurunun değiştirilebileceğini gösterir. Aşağıdaki örnek, çıkış noktası için bir başvuru döndürür. Çağıranların readonly kaynağı değiştiremediğini belirtmek için değiştiriciyi kullanır:

private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0);
public static ref readonly SamplePoint Origin => ref s_origin;

Döndürülen türün olması readonly structgerekmez. tarafından ref döndürülebilecek herhangi bir tür tarafından ref readonlydöndürülebilir.

Salt okunur başvuru salt okunur dönüş örneği

Aref readonly return, türlerde struct örnek üyeleriyle readonly de kullanılabilir:

public struct ReadonlyRefReadonlyExample
{
    private int _data;

    public readonly ref readonly int ReadonlyRefReadonly(ref int reference)
    {
        // _data = 1; // Compile error if uncommented.
        return ref reference;
    }
}

yöntemi temelde örnek üyesiyle (bu örnekte bir yöntem) readonly bir başvuru döndürür readonly (hiçbir örnek alanını değiştiremez).

C# dili belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.

Dil belirtimi tekliflerini de görebilirsiniz:

Ayrıca bkz.