readonly (C# Başvurusu)

anahtar readonly sözcüğü, dört bağlamda kullanılan bir değiştiricidir:

  • Bir alan bildiriminde,alana atamanın yalnızca bildirimin bir parçası olarak veya readonly aynı sınıftaki bir oluşturucuda meydana gelebilir olduğunu gösterir. Salt okunur bir alan, alan bildirimi ve oluşturucusu içinde birden çok kez atanabilir ve yeniden atanabilir.

    readonlyOluşturucu çıkıştan sonra bir alan atanabilir. Bu kuralın değer türleri ve başvuru türleri üzerinde farklı etkileri vardır:

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

    Uyarı

    Table 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ı tetikler: "Salt okunur tarifeli başvuru türlerini bildirgeyebilirsiniz."

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

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

  • Yöntemin ref readonly döndürtme readonly yönteminde değiştirici bir başvuru döndüren ve bu başvuruya yazmalara izin verilmeyecek olduğunu gösterir.

readonly structve ref readonly bağlamları C# 7.2'ye eklendi. readonly C# 8.0'da yapı üyeleri eklendi

Salt okunur alan örneği

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

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

Bir alana yalnızca aşağıdaki readonly bağlamlarda değer atebilirsiniz:

  • değişken bildiriminde başlatılmışsa, örneğin:

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

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

Bu oluşturucu bağlamları aynı zamanda bir alanı out veya ref parametresi olarak geçmenin geçerli readonly olduğu tek bağlamdır.

Not

anahtar readonly sözcüğü const anahtar sözcüğünden farklıdır. constBir alan yalnızca alanın bildiriminde başlatılmış olabilir. Bir readonly alan, alan bildiriminde ve herhangi bir oluşturucuda birden çok kez atanabilir. Bu readonly nedenle, alanlar kullanılan oluşturucuya bağlı olarak farklı değerlere sahip olabilir. Ayrıca, bir alan derleme zamanı sabitiyken, alan aşağıdaki örnekte olduğu gibi çalışma zamanı const readonly 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 deyimi kullanırsanı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)

Başvuru salt okunur dönüş örneği

üzerinde readonly ref return değiştiricisi, döndürülen başvuruda değişiklik yapılamaz olduğunu gösterir. Aşağıdaki örnek, çıkış noktası için bir başvuru döndürür. readonlyÇağıranların kaynağı değiştire olmadığını 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 struct değil. tarafından döndürülen herhangi bir ref tür tarafından döndürül ref readonly olabilir.

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.

Ayrıca dil belirtimi tekliflerini de görebilirsiniz:

Ayrıca bkz.