readonly (C# Başvurusu)
anahtar readonly
sözcüğü dört 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 kendi verilerine başvuru içerdiğinden, başvuru türü olan bir
readonly
alanın her zaman aynı nesneye başvurması gerekir. Bu nesne sabit değil. Değiştirici,readonly
alanın 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ünen salt okunur bir alan içeren dışarıdan görünen bir tür bir güvenlik açığı olabilir ve CA2104 uyarısını tetikleyebilir: "Salt okunur değiştirilebilir başvuru türlerini bildirme."
- Değer türleri doğrudan verilerini içerdiği için, değer türü olan bir
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üsundareadonly
değiştirici, yöntemin bir başvuru döndürdüğünü ve bu başvuruya yazma işlemine izin verilmediğini belirtir.
Salt okunur alan örneği
Bu örnekte, sınıf oluşturucusunda bir değer atanmış olsa bile, alanının year
değeri yönteminde ChangeYear
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 bağlamlarda değer readonly
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 olduğu tek bağlamlardır.
Not
Anahtar readonly
sözcük, 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ı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
üzerindeki ref return
değiştirici, readonly
döndürülen başvurunun değiştirilebileceğini gösterir. Aşağıdaki örnek, kaynak için bir başvuru döndürür. Çağıranların readonly
kaynağı değiştiremeyeceklerini 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
gerekmez. tarafından ref
döndürülebilecek herhangi bir tür tarafından ref readonly
döndürülebilir.
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: