Null atanabilir değer türleri: C# Ile İlgili Temel Bilgiler

Tip

Bu makale, en az bir programlama dili bilen ve C# dilini öğrenen geliştiriciler için Temel Bilgiler bölümünün bir parçasıdır. Programlamaya yeni başladıysanız ilk olarak Başlangıç öğreticileri ile başlayın. Daha fazla ayrıntı için dil referansında Null atanabilir değer türleri'ne bakın.

Null atanabilir değer türüT?, temel değer türünün Ttüm değerlerini ve ek null bir değeri temsil eder. Türünde int? bir değişken herhangi bir tamsayı tutar veya null "değer yok" ifadesini temsil eder.

Değer türleri, örneğin int, bool ve DateTime, varsayılan olarak null tutamaz. Bu davranış verimlidir ve birçok hatayı önler. Ancak bu sınırlama, bir değerin gerçekten eksik olabileceği durumlarda bir sorun oluşturur. Yaygın bir senaryo veritabanından okumaktır: tamsayı sütunu bir sayı içerebilir veya hiç değer içermeyebilir (NULL SQL'de). int bu yokluğu temsil edemez, ancak int? edebilir.

Null atanabilir bir değer türü bildirme

Değer türünü boş değer atanabilir hale getirmek için ? ekleyin.

int?    age      = null;    // integer with no value yet
double? price    = 9.99;    // nullable double with a value
bool?   isActive = null;    // boolean with no value

age = 30;                   // assign a value later

int?[] scores = [100, null, 85, null, 72]; // array with absent entries

Null atanabilir bir değer türünün varsayılan değeri null'dir, temel türün varsayılan değeri değildir.

Bir değerin mevcut olup olmadığını denetleme

Boş yapılabilir bir değer türünü denetlemenin ve değerini ayıklamanın önerilen yolu bir tür deseni kullanmaktır.

int? temperature = 72;

if (temperature is int degrees)
{
    Console.WriteLine($"Temperature is {degrees}°F.");
}
else
{
    Console.WriteLine("Temperature is not recorded.");
}
// Output: Temperature is 72°F.

Kalıp is int degrees, yalnızca temperature null değilse eşleşir ve aynı anda değeri degrees öğesine bağlar. Bir adımda hem null denetimi hem de değer ayıklamasını alırsınız.

Alternatif olarak, HasValue ve Value özelliklerini kullanın.

int? count = 42;

if (count.HasValue)
{
    Console.WriteLine($"Count is {count.Value}.");
}
else
{
    Console.WriteLine("Count has no value.");
}
// Output: Count is 42.

Yeni kod için deseni is T value tercih edin. Eşleşen dala sınırlandırılmış, amacı daha net hale getiren ve yanlışlıkla Value'yi bir null kontrolü dışında kullanma cazibesini ortadan kaldıran yeni bir null atanamaz değişken tanıtır. Bu koşulda bir InvalidOperationException fırlatır.

"null ile doğrudan karşılaştırabilirsiniz."

int? quantity = null;

if (quantity != null)
{
    Console.WriteLine($"Quantity: {quantity.Value}");
}
else
{
    Console.WriteLine("Quantity is not set.");
}
// Output: Quantity is not set.

Geri dönüş ile değer alma

Null atanabilir bir değerden null atanamaz bir değere ihtiyacınız olduğunda GetValueOrDefault veya birleştirme işlecini kullanın: ??

int? rating = null;

int result1 = rating.GetValueOrDefault();    // 0 (default for int)
int result2 = rating.GetValueOrDefault(-1);  // -1 (specified fallback)

Console.WriteLine(result1); // 0
Console.WriteLine(result2); // -1

rating = 5;
int result3 = rating.GetValueOrDefault(-1);  // 5 (actual value)
Console.WriteLine(result3); // 5

İşleç ?? genellikle satır içi kullanıldığında daha temizdir.

int? priority = null;

int effective = priority ?? 0;  // 0 because priority is null
Console.WriteLine(effective);   // 0

priority  = 3;
effective = priority ?? 0;      // 3 because priority has a value
Console.WriteLine(effective);   // 3

Her iki yaklaşım da mevcut olduğunda gerçek değeri ve mevcut olmadığında belirttiğiniz yedek değeri döndürür.

Null değer türleriyle aritmetik

Null değer türlerinde aritmetik ve karşılaştırma işleçleri yükseltilir: işlenenlerden biri null olduğunda, sonuç bir hata yerine null olur.

int? a = 10;
int? b = 20;
int? c = null;

int? sum     = a + b;   // both non-null: result is 30
int? product = a * c;   // one operand is null: result is null

Console.WriteLine(sum);               // 30
Console.WriteLine(product.HasValue);  // False — null propagates through arithmetic

Null varsayılan olarak aritmetik aracılığıyla yayılır. Null sonucunun daha fazla yayılmasını önlemek için, değeri hesaplamada kullanmadan önce ya da ?? ile GetValueOrDefault ile ayıklayın.

Ayrıca bakınız