const
ve readonly
benzerdir, ancak tam olarak aynı değildirler.
Bir const
alan derleme zamanı sabitidir, yani bu değer derleme zamanında hesaplanabilir. Bir readonly
alan bazı kod tipi inşaatı sırasında çalıştırılmalıdır hangi ek senaryolar sağlar. İnşaattan sonra bir readonly
alan değiştirilemez.
Örneğin, const
üyeler aşağıdaki gibi üyeleri tanımlamak için kullanılabilir:
struct Test
{
public const double Pi = 3.14;
public const int Zero = 0;
}
3.14 ve 0 gibi değerler derleme zamanı sabitleridir. Ancak, bir tür tanımladığınız ve bu türün bazı fab öncesi örneklerini sağlamak istediğiniz durumu göz önünde bulundurun. Örneğin, bir Color sınıfı tanımlamak ve Siyah, Beyaz vb. Ortak renkler için "sabitler" sağlamak isteyebilirsiniz. Sağ taraflar derleme zamanı sabitleri olmadığından bunu const üyeleriyle yapmak mümkün değildir. Bunu düzenli statik üyelerle yapabiliriz:
public class Color
{
public static Color Black = new Color(0, 0, 0);
public static Color White = new Color(255, 255, 255);
public static Color Red = new Color(255, 0, 0);
public static Color Green = new Color(0, 255, 0);
public static Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}
Ama sonra, bir Renk müşterisinin, belki de Siyah ve Beyaz değerlerini değiştirerek, onunla karışmasını engelleyecek hiçbir şey yoktur. Söylemeye gerek yok, bu, Color sınıfının diğer istemcileri için şaşkınlığa neden olur. "Salt okunur" özellik bu senaryoyu ele alır.
readonly
Anahtar kelimeyi yalnızca bildirimlere ekleyerek, istemci kodunun karışmasını önlerken esnek başlatmayı koruruz.
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}
Const üyelerinin her zaman statik olduğunu, ancak salt okunur bir üyenin normal bir alan gibi statik olabileceğini veya olmayabileceğini belirtmek ilginçtir.
Bu iki amaç için tek bir anahtar kelime kullanmak mümkündür, ancak bu sürüm oluşturma sorunlarına veya performans sorunlarına yol açar. Bir an için bunun için (const) tek bir anahtar kelime kullandığımızı ve bir geliştiricinin şunu yazdığını varsayın:
public class A
{
public static const C = 0;
}
ve farklı bir geliştirici A'ya dayanan bir kod yazdı:
public class B
{
static void Main() => Console.WriteLine(A.C);
}
Şimdi, oluşturulan kod AC'nin derleme zamanı sabiti olmasına güvenebilir mi? Yani, AC kullanımı sadece 0 değeri ile değiştirilebilir mi? Buna "evet" derseniz, A geliştiricisinin AC'nin başlatılma şeklini değiştiremeyeceği anlamına gelir - bu, A geliştiricisinin ellerini izinsiz bağlar.
Bu soruya "hayır" derseniz, önemli bir optimizasyon kaçırılır. Belki de A'nın yazarı AC'nin her zaman sıfır olacağı konusunda olumludur. Hem const hem de salt okunur kullanımı, A geliştiricisinin amacı belirtmesine izin verir. Bu, daha iyi sürüm oluşturma davranışı ve daha iyi performans sağlar.
static readonly
: İçindeIEnumerator
bir kontrol edilemeyen tetikleyecek bir const kullanmayı deneyinyield
ve korkunç bir "Dahili derleyici hatası" alırsınız . Unity3D dışında kodu test etmedim, ama bu bir mono veya .NET hatası olduğuna inanıyorum . Yine de bir c # sorun.