Sabitler ve readonly Alanları
const ile static readonly arasındaki farkı anlayın.
Sabitler ve readonly Alanları, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Değerleri Sabitlemenin İki Yolu
C#, değişmemesi gereken değerler için const ve readonly seçeneklerini sunar. Benzer görünürler, ancak çok farklı davranırlar. Bu derste aralarındaki farkları karşılaştıracağız.
using System;
class Config
{
public const double Pi = 3.14159;
public static readonly DateTime StartedAt = DateTime.Now;
}
class Program
{
static void Main()
{
Console.WriteLine("Pi = " + Config.Pi);
}
}Sabit: Derleme Zamanı Sabiti
Bir const, tanımlandığı sırada doğrudan bir değerle atanmalı ve derleme zamanında sabitlenmelidir. Örtük olarak statiktir.
using System;
class Circle
{
public const double Pi = 3.14159;
public static double Area(double r) => Pi * r * r;
}
class Program
{
static void Main()
{
Console.WriteLine(Circle.Area(2).ToString("0.00"));
}
}Sabit Bir Doğrudan Değer Olmalıdır
Derleme zamanında çözümlendiği için bir const yalnızca sabit bir ifade içerebilir: sayılar, dizeler, doğru/yanlış değerleri veya diğer sabitler.
using System;
class Limits
{
public const int MaxRetries = 3;
public const int Timeout = MaxRetries * 1000; // const expression OK
}
class Program
{
static void Main()
{
Console.WriteLine(Limits.MaxRetries + ", " + Limits.Timeout);
}
}Salt Okunur: Çalışma Zamanı Sabiti
Bir readonly alana tanımlama sırasında veya bir oluşturucuda bir kez değer atanır ve ardından değiştirilemez. Değeri çalışma zamanında hesaplanabilir.
using System;
class Session
{
public readonly string Id;
public Session(string id)
{
Id = id; // allowed: inside constructor
}
}
class Program
{
static void Main()
{
var s = new Session("abc-123");
Console.WriteLine("Session: " + s.Id);
}
}Salt Okunur Alanlar Çalışma Zamanı Değerlerini Kullanabilir
const değerinden farklı olarak readonly alanı, program çalışırken öğrenilen bir değeri, örneğin oluşturulan bir kimliği veya geçerli zamanı içerebilir.
using System;
class Order
{
public readonly Guid OrderId;
public Order()
{
OrderId = Guid.NewGuid();
}
}
class Program
{
static void Main()
{
var o = new Order();
Console.WriteLine("Has id: " + (o.OrderId != Guid.Empty));
}
}statik readonly
Çalışma zamanında bir kez hesaplanan sınıf genelindeki bir değer için static readonly birleşimini kullanın. Değer doğrudan bir değer olmadığında bu, genellikle const yerine kullanılır.
using System;
class AppInfo
{
public static readonly string[] Roles = { "admin", "user", "guest" };
}
class Program
{
static void Main()
{
Console.WriteLine("Roles: " + Roles());
}
static int Roles() => AppInfo.Roles.Length;
}const Birleştirmeler Arasında Neden Riskli Olabilir
const değerleri derleme zamanında çağıran koda doğrudan yerleştirildiği için, bir kitaplıktaki genel kullanıma açık const değerini değiştirdiğinizde tüm çağıranları yeniden derlemeniz gerekir. static readonly bu sorunu önler.
using System;
class Lib
{
public const int Version = 2; // inlined into callers
public static readonly int Build = 100; // read at runtime
}
class Program
{
static void Main()
{
Console.WriteLine(Lib.Version + "." + Lib.Build);
}
}İkisinden Hiçbiri Yeniden Atanamaz
Başlatma işleminden sonra ne bir const alanı ne de bir readonly alanı değiştirilebilir. Bunu yapmaya çalışmak derleme hatasına neden olur.
using System;
class Demo
{
public const int A = 10;
public readonly int B;
public Demo() { B = 20; }
// A = 11; // would not compile
// B = 21; // would not compile outside constructor
}
class Program
{
static void Main()
{
var d = new Demo();
Console.WriteLine(Demo.A + ", " + d.B);
}
}İkisinden Hangisini Seçmeli
Hiç değişmeyen gerçek sabit değerler için const kullanın (Pi, MaxInt). Değer çalışma zamanında hesaplanıyorsa veya her örnek için farklı olabiliyorsa readonly kullanın.
using System;
class Physics
{
public const double Gravity = 9.81; // universal literal
public readonly double Mass; // per object
public Physics(double mass) { Mass = mass; }
public double Weight() => Mass * Gravity;
}
class Program
{
static void Main()
{
var p = new Physics(10);
Console.WriteLine("Weight: " + p.Weight());
}
}readonly Başvurusu Hakkında Uyarı
readonly, alanı kilitler; alanın işaret ettiği nesneyi değil. Salt okunur bir liste başvurusu yeniden atanamaz, ancak listenin içeriği yine de değiştirilebilir.
using System;
using System.Collections.Generic;
class Cart
{
public readonly List<string> Items = new List<string>();
}
class Program
{
static void Main()
{
var c = new Cart();
c.Items.Add("Pen"); // allowed: mutating the object
c.Items.Add("Book");
Console.WriteLine("Items: " + c.Items.Count);
}
}Birleştirelim
Tipik bir sınıf, değişmeyen sabit değerler için const, oluşturulma zamanında her örnek için sabitlenen değerler içinse readonly kullanır.
using System;
class Account
{
public const decimal MinBalance = 0m;
public readonly string Owner;
public Account(string owner)
{
Owner = owner;
}
}
class Program
{
static void Main()
{
var a = new Account("Rin");
Console.WriteLine(a.Owner + " min=" + Account.MinBalance);
}
}Kısa Kontrol
const ile readonly arasındaki farkı anlayıp anlamadığınızı sınayın.
Özet
const, derleme zamanında belirlenen bir sabit değerdir, örtük olarak statiktir ve çağıran kodlara doğrudan yerleştirilir. readonly, bildirim sırasında veya bir oluşturucuda bir kez atanır ve çalışma zamanı değerlerini kullanabilir. Gerçek sabit değerler için const, çalışma zamanında hesaplanan paylaşılan değerler için static readonly kullanın. Ayrıca readonly değerinin başvuruyu kilitlediğini, nesneyi kilitlemediğini unutmayın.
using System;
class Demo
{
public const int Max = 100;
public readonly int Created;
public Demo(int c) { Created = c; }
}
class Program
{
static void Main()
{
var d = new Demo(7);
Console.WriteLine(Demo.Max + ", " + d.Created);
}
}Sıkça Sorulan Sorular
“Sabitler ve readonly Alanları” dersi ücretsiz mi?
Evet — “Sabitler ve readonly Alanları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Sabitler ve readonly Alanları” dersinde ne öğreneceğim?
const ile static readonly arasındaki farkı anlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Sabitler ve readonly Alanları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Statik Yöntemler ve Alanlar
- Yardımcı Programlar için Statik Sınıflar
- Sabitler ve readonly Alanları
- Statik ve Örnek Tasarımı