readonly (C# Başvurusu)readonly (C# Reference)

readonly Anahtar sözcüğü, üç bağlamlarda kullanılan bir değiştirici:The readonly keyword is a modifier that can be used in three contexts:

  • İçinde bir alan bildirimi, readonly alana atama bildirimin veya aynı sınıftaki bir oluşturucunun parçası olarak yalnızca oluşabilir gösterir.In a field declaration, readonly indicates that assignment to the field can only occur as part of the declaration or in a constructor in the same class. Salt okunur bir alan atanabilir ve alan bildirimi ve oluşturucu içinde birden çok kez yeniden atandı.A readonly field can be assigned and reassigned multiple times within the field declaration and constructor.

    A readonly alan oluşturucu çıktıktan sonra atanamaz.A readonly field cannot be assigned after the constructor exits. Değer türleri ve başvuru türleri için farklı biçimlerde olan:That has different implications for value types and reference types:

    • Değer türleri verilerini doğrudan içerdiği için olan bir alan bir readonly değişmez değer türü.Because value types directly contain their data, a field that is a readonly value type is immutable.
    • Başvuru türleri verilerine bir başvuru içerdiğinden olan bir alan bir readonly başvuru türü her zaman aynı nesneye başvurmalıdır.Because reference types contain a reference to their data, a field that is a readonly reference type must always refer to the same object. Bu nesne sabit değil.That object is not immutable. readonly Değiştiricisi başvuru türü farklı bir örneğine yerini alan engeller.The readonly modifier prevents the field from being replaced by a different instance of the reference type. Ancak değiştiricisi, örnek veri alanının salt okunur alanı değiştirilmiş engellemez.However, the modifier does not prevent the instance data of the field from being modified through the read-only field.

    Uyarı

    Dışarıdan görünen tür, kesilebilir başvuru türü olan bir dışarıdan görünen salt okunur alan içeren bir güvenlik açığı olabilir ve uyarı tetikleyebilir CA2104 : "Salt okunur kesilebilir başvuru türleri bildirmeyin."An externally visible type that contains an externally visible read-only field that is a mutable reference type may be a security vulnerability and may trigger warning CA2104 : "Do not declare read only mutable reference types."

  • İçinde bir readonly struct tanımı, readonly belirten struct sabittir.In a readonly struct definition, readonly indicates that the struct is immutable.

  • İçinde bir ref readonly yöntemi dönüş, readonly değiştiricisi gösteren bir başvuru ve yazma işlemleri bu başvurusuna izin verilmez yöntemi döndürür.In a ref readonly method return, the readonly modifier indicates that method returns a reference and writes are not allowed to that reference.

Son iki bağlamdan, C# 7.2 eklendi.The final two contexts were added in C# 7.2.

Salt okunur alanı örneğiReadonly field example

Bu örnekte, alanın değerini year yöntemi değiştirilemez ChangeYearrağmen sınıf oluşturucusu bir değer atanır:In this example, the value of the field year cannot be changed in the method ChangeYear, even though it is assigned a value in the class constructor:

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

Bir değer atamak için bir readonly yalnızca şu bağlamlarda alan:You can assign a value to a readonly field only in the following contexts:

  • Ne zaman Değişken bildiriminde örneğin başlatılır:When the variable is initialized in the declaration, for example:

    public readonly int y = 5;
    
  • Bir sınıfın örnek oluşturucusunda örnek alan bildirimi içerir.In an instance constructor of the class that contains the instance field declaration.

  • Statik Oluşturucu sınıfın statik alan bildirimi içerir.In the static constructor of the class that contains the static field declaration.

Bu oluşturucu bağlamları de yalnızca bağlamları olduğu geçirmek için geçerli olan bir readonly olarak alan bir kullanıma veya ref parametresi.These constructor contexts are also the only contexts in which it is valid to pass a readonly field as an out or ref parameter.

Not

readonly Anahtar sözcüğü, farklı const anahtar sözcüğü.The readonly keyword is different from the const keyword. A const alanı alanın bildiriminde yalnızca başlatılabilir.A const field can only be initialized at the declaration of the field. A readonly alan alan bildirimi ve herhangi bir oluşturucu birden çok kez atanabilir.A readonly field can be assigned multiple times in the field declaration and in any constructor. Bu nedenle, readonly alanları kullanılan oluşturucuya bağlı olarak farklı değerlere sahip olabilir.Therefore, readonly fields can have different values depending on the constructor used. Ayrıca, while bir const alandır bir derleme zamanı sabiti readonly alan, aşağıdaki örnekte olduğu gibi çalışma zamanı sabitleri için kullanılabilir:Also, while a const field is a compile-time constant, the readonly field can be used for runtime constants as in the following example:

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

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

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

    public static void Main()
    {
        SampleClass p1 = new SampleClass(11, 21, 32);   // OK
        Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
        SampleClass p2 = new SampleClass();
        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
    */
}

Önceki örnekte, aşağıdaki örnekte olduğu gibi bir deyim kullanıyorsanız:In the preceding example, if you use a statement like the following example:

p2.y = 66;        // Error

Derleyici hata iletisini alırsınız:you will get the compiler error message:

A readonly field cannot be assigned to (except in a constructor or a variable initializer)

Salt okunur yapı örneğiReadonly struct example

readonly Değiştiricisi bir struct tanımı, yapı olduğunu bildirir değişmez.The readonly modifier on a struct definition declares that the struct is immutable. Her örnek alan struct işaretlenmelidir readonly, aşağıdaki örnekte gösterildiği gibi:Every instance field of the struct must be marked readonly, as shown in the following example:

public readonly struct Point
{
    public double X { get; }
    public double Y { get; }

    public Point(double x, double y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

Önceki örnekte salt okunur otomatik özellikleri depolamasını bildirmek için.The preceding example uses readonly auto properties to declare its storage. Derleyicinin oluşturmasını söyler readonly destek alanları için bu özellikleri.That instructs the compiler to create readonly backing fields for those properties. Ayrıca bildirip readonly doğrudan alanlar:You could also declare readonly fields directly:

public readonly struct Point
{
    public readonly double X;
    public readonly double Y;

    public Point(double x, double y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

İşaretlenmemiş bir alan ekleme readonly derleyici hatası oluşturur CS8340: "Salt okunur yapı birimlerinin örnek alanları salt okunur olmalıdır."Adding a field not marked readonly generates compiler error CS8340: "Instance fields of readonly structs must be readonly."

Ref salt okunur dönüş örneğiRef readonly return example

readonly Değiştiricisi bir ref return döndürülen başvuru değiştirilemeyeceğini belirtir.The readonly modifier on a ref return indicates that the returned reference cannot be modified. Aşağıdaki örnek, kaynağı bir başvuru döndürür.The following example returns a reference to the origin. Kullandığı readonly değiştiricisi arayanları kaynağı değiştirilemiyor belirtmek için:It uses the readonly modifier to indicate that callers cannot modify the origin:

private static readonly Point origin = new Point(0, 0);
public static ref readonly Point Origin => ref origin;

Döndürülen tür olması gerekmez bir readonly struct.The type returned doesn't need to be a readonly struct. Tarafından döndürülen herhangi bir türü ref tarafından döndürülen ref readonly.Any type that can be returned by ref can be returned by ref readonly.

C# dili 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