C# null güvenliği

İpucu

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.

Java'den mi yoksa C++'tan mı geliyorsunuz? C# null kabul eden başvuru türleri aracılığıyla derleme süresi null güvenliği sağlar. Hedef, Java @NonNull ek açıklamalarına benzer ancak derleyici tarafından zorlanır. C#, ?. ve ?? gibi null güvenli ifadeleri kısa ve öz hale getiren özel operatörlere de sahiptir.

null bir değerin yokluğunu temsil eder. Bir başvurudaki null bir üyeye bir yöntemi çağırarak veya bir özelliği okuyarak erişmeye çalıştığınızda, çalışma zamanı bir NullReferenceException oluşturur:

// Accessing a member on null throws NullReferenceException at runtime:
// string? name = null;
// int length = name.Length; // throws NullReferenceException

// Check before you dereference:
string? name = null;
if (name is not null)
{
    Console.WriteLine($"Name has {name.Length} characters.");
}
else
{
    Console.WriteLine("Name has no value.");
}
// Output: Name has no value.

C# size null güvenli kod yazmak için üç tamamlayıcı araç sağlar:

  • Null atanabilir değer türleri: int gibi bir değer türü veya bool, null değerini de tutabilir.
  • Null atanabilir başvuru türleri: Derleyicinin bir başvurunun null olabilme durumunu izlemesine izin verin null
  • Null işleçler: null güvenli erişimi ve geri dönüş mantığını kısa bir şekilde ifade edin

Null değeri alabilen değer türleri

Değer türleri, örneğin int, double ve bool, varsayılan olarak null tutamaz. Tür adına ? ekleyerek, ya bir değer ya da içeren bir null oluşturabilirsiniz.

int? score = null;
Console.WriteLine(score.HasValue);               // False

score = 95;
Console.WriteLine(score.HasValue);               // True
Console.WriteLine(score.GetValueOrDefault());    // 95

int? missing = null;
Console.WriteLine(missing.GetValueOrDefault(-1)); // -1

Temel bir değer türünün "veri yok" değerini temsil etmesi gerektiğinde boş atanabilir değer türleri yararlıdır. Yaygın senaryolar arasında var olmayan veritabanı sütunları, isteğe bağlı yapılandırma ayarları ve henüz elde edilmemiş algılayıcı okumaları bulunur.

Bildirim, denetim ve dönüştürmenin tam kapsamı için bkz. Nullable değer türleri.

Null değer alabilen referans türleri

string gibi başvuru türleri, diziler ve sınıf örnekleri çalışma zamanında null tutabilir. Null atanabilir başvuru türleri , null amacı açık hale getiren ve derleme zamanında hataları yakalayan bir derleyici özelliğidir.

Ek açıklamayı ? kullanarak amacınızı bildirirsiniz:

  • string?— bu başvuru olabilirnull; önce denetlemeden başvuruyu kaldırmanız durumunda derleyici uyarır
  • string — bu referans olmamalıdırnull; buna bir değer atarsanız derleyici sizi uyarır
// string?  means this reference might be null
// string   means this reference should not be null
string? nullableName = null;
string  nonNullName  = "Alice";

// ?. safely accesses a member when the reference might be null
string display = nullableName?.ToUpper() ?? "(no name)";
Console.WriteLine(display);         // (no name)

display = nonNullName.ToUpper();    // safe: nonNullName is never null
Console.WriteLine(display);         // ALICE

Modern SDK şablonlarının oluşturduğu tüm .NET projeleri, varsayılan olarak null atanabilir başvuru türlerini etkinleştirir. Etkinleştirme ve açıklama ekleme konusunda tam yönergeler için bkz. Null atanabilir başvuru türleri.

Null işleçler

C# her yerde el ile if-null korumaları olmadan null güvenli kod yazmanıza olanak sağlayan birkaç işleç içerir:

Operator Name Purpose
?. Null koşullu üye erişimi Üyeye yalnızca nesne null olmadığında erişin
?[] Null koşullu dizin oluşturucu erişimi Bir öğeye yalnızca koleksiyon null olmadığında erişin
?? Null birleştirme İfade null olduğunda yedek bir değer döndür.
??= Null birleşim ataması Değişken null olduğunda yalnızca atayın
is null / is not null Null desen Tercih edilen null test
string? city = GetCity();

// ?. — access a member only when non-null
int? len = city?.Length;

// ?? — substitute a default when null
string display = city ?? "unknown";

// is null — preferred null test
if (city is null)
{
    Console.WriteLine("No city provided.");
}
else
{
    Console.WriteLine($"{display} ({len} chars)");
}
// Output: No city provided.

Her işlecin ayrıntılı örnekleri için bkz. Null işleçler.

Null değer atanabilir türler ve null başvuru türleri farklı amaçlara hizmet eder.

Null atanabilir değer türleri ve null atanabilir referans türleri birbirinin alternatifi değildir. Farklı sorunları çözer:

  • "Değer yok" ifadesini temsil etmesi gereken bir değer türü için kullanınT?. Örneğin, isteğe bağlı bir veritabanı sütunu veya int? henüz zamanlanmamış bir olay için kullanınDateTime?.
  • Derleyicinin, çalışma zamanında bir string? gerçekleşmeden önce sizi uyarabilmesi için ve diğer null atanabilir başvuru ek açıklamalarını kullanarak bir başvurunun null belgeleyinNullReferenceException.

Bu özellikler ve null işleçler birlikte null-safe C# kodu yazmak için eksiksiz bir araç kümesi sağlar.