Null yapılabilir başvuru türleri (C# Başvurusu)
Not
Bu makalede null yapılabilir başvuru türleri ele alınmaktadır. Null olabilir değer türleride bildirebilirsiniz.
Null yapılabilir başvuru türleri, null yapılabilen bir içeriğe sahip olan kodda C# 8,0 ile başlayarak kullanılabilir. Null yapılabilir başvuru türleri, null statik analiz uyarıları ve null-forverme işleci isteğe bağlı dil özellikleridir. Tümü varsayılan olarak kapalıdır. Null yapılabilir bağlam , derleme ayarları kullanılarak proje düzeyinde veya pragmalar kullanılarak kodda denetlenir.
Null yapılabilir bir bağlamda:
- Başvuru türünün bir değişkeni
Tnull olmayan bir değerle başlatılmalıdır ve hiçbir şekilde bir değer atanmayabilirnull. - Başvuru türündeki bir değişken
T?null, veya atanmışnullolarak başlatılabilir, ancaknullbaşvurulmadan önce gözden alınması gerekir. - Türünde bir değişken,
mT?içinde olduğu gibi null-forverme işlecini uyguladığınızda null olmayan olarak değerlendirilirm!.
Null yapılamayan bir başvuru türü T ve null yapılabilen bir başvuru türü arasındaki farklılıklar, T? derleyicinin önceki kuralların yorumu tarafından zorlanır. Türünde bir değişken T ve türünde bir değişken T? aynı .NET türü tarafından temsil edilir. Aşağıdaki örnek, null olamayan bir dize ve null yapılabilen bir dize bildirir ve null olmayan bir dizeye değer atamak için null-forverme işlecini kullanır:
string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness
Değişkenler notNull ve nullable her ikisi de türü tarafından temsil edilir String . Null değer atanamaz ve null atanabilir türler aynı türde depolandığından, null yapılabilir bir başvuru türü kullanılmasına izin verilmez. Genel olarak, null yapılabilir bir başvuru türü, temel sınıf veya uygulanan arabirim olarak kullanılamaz. Herhangi bir nesne oluşturma veya tür testi ifadesinde null yapılabilen bir başvuru türü kullanılamaz. Null yapılabilir bir başvuru türü üye erişim ifadesinin türü olamaz. Aşağıdaki örneklerde bu yapılar gösterilmektedir:
public MyClass : System.Object? // not allowed
{
}
var nullEmpty = System.String?.Empty; // Not allowed
var maybeObject = new object?(); // Not allowed
try
{
if (thing is string? nullableString) // not allowed
Console.WriteLine(nullableString);
} catch (Exception? e) // Not Allowed
{
Console.WriteLine("error");
}
Null yapılabilir başvurular ve statik analiz
Önceki bölümdeki örneklerde, null yapılabilir başvuru türlerinin doğası gösterilmektedir. Null yapılabilir başvuru türleri yeni sınıf türleri değil, var olan başvuru türlerinde ek açıklamalar değildir. Derleyici, kodunuzda olası null başvuru hatalarını bulmanıza yardımcı olması için bu ek açıklamaları kullanır. Null yapılamayan bir başvuru türü ve null yapılabilir bir başvuru türü arasında çalışma zamanı farkı yoktur. Derleyici, null olamayan başvuru türleri için hiçbir çalışma zamanı denetimi eklemez. Avantajlar, derleme zamanı analizinde bulunur. Derleyici, kodunuzdaki olası null hataları bulmanıza ve düzeltmenize yardımcı olan uyarılar oluşturur. Amacınızı bildirirsiniz ve kodunuz bu amacı ihlal ettiğinde derleyici sizi uyarır.
Null yapılabilir etkin bir bağlamda derleyici, herhangi bir başvuru türünün değişkenlerinde statik analiz gerçekleştirir, hem null yapılabilir hem de null değer atanamaz. Derleyici, her başvuru değişkeninin null durumunu null ya da belki null olarak izler. Null yapılamayan bir başvurunun varsayılan durumu null değil. Null yapılabilen bir başvurunun varsayılan durumu belki-null olur.
Null durumu null olmadığından Nullable başvuru türleri başvuru için her zaman güvenli olmalıdır. Bu kuralı zorlamak için, null olamayan bir başvuru türü null olmayan bir değere başlatılmamışsa, derleyici uyarıları yayınlar. Yerel değişkenlerin, bildirildiği yere atanması gerekir. Her alana, bir alan başlatıcısında veya her oluşturucuda null olmayan bir değer atanmalıdır. Derleyici, durumu null olan bir başvuruya atanamayan bir başvuru atandığında uyarı verir. Genel olarak, null olamayan bir başvuru, null değildir ve bu değişkenlere başvurulduğunu hiçbir uyarı verilmez.
Not
Null yapılamayan bir başvuru türüne belki-null ifadesi atarsanız, derleyici bir uyarı oluşturur. Daha sonra derleyici, null olmayan bir ifadeye atanana kadar bu değişken için uyarı oluşturur.
Null yapılabilir başvuru türleri başlatılabilir veya atanabilir null . Bu nedenle, Statik Analize başvurulmadan önce bir değişkenin null olduğunu belirlemesi gerekir. Null yapılabilir bir başvurunun null olduğu belirlenirse, null olamayan bir başvuruya atama bir derleyici uyarısı oluşturur. Aşağıdaki sınıf bu uyarıların örneklerini gösterir:
public class ProductDescription
{
private string shortDescription;
private string? detailedDescription;
public ProductDescription() // Warning! shortDescription not initialized.
{
}
public ProductDescription(string productDescription) =>
this.shortDescription = productDescription;
public void SetDescriptions(string productDescription, string? details=null)
{
shortDescription = productDescription;
detailedDescription = details;
}
public string GetDescription()
{
if (detailedDescription.Length == 0) // Warning! dereference possible null
{
return shortDescription;
}
else
{
return $"{shortDescription}\n{detailedDescription}";
}
}
public string FullDescription()
{
if (detailedDescription == null)
{
return shortDescription;
}
else if (detailedDescription.Length > 0) // OK, detailedDescription can't be null.
{
return $"{shortDescription}\n{detailedDescription}";
}
return shortDescription;
}
}
Aşağıdaki kod parçacığında, bu sınıfı kullanırken derleyicinin uyarı yayar konumu gösterilmektedir:
string shortDescription = default; // Warning! non-nullable set to null;
var product = new ProductDescription(shortDescription); // Warning! static analysis knows shortDescription maybe null.
string description = "widget";
var item = new ProductDescription(description);
item.SetDescriptions(description, "These widgets will do everything.");
Yukarıdaki örneklerde derleyicinin statik analizinin, başvuru değişkenlerinin null durumunu nasıl belirlediği gösterilmektedir. Derleyici, analizini bilgilendirmek için null denetimleri ve atamaları için dil kuralları uygular. Derleyici, yöntemlerin veya özelliklerin semantiği hakkında varsayımlar yapamaz. Null denetimleri gerçekleştiren Yöntemler çağırırsanız, derleyici bu yöntemlerin bir değişkenin null durumunu etkilediğini bilmez. Derleyiciye bağımsız değişkenlerin semantiğini ve dönüş değerlerini bildirmek için, API 'lerinize ekleyebileceğiniz öznitelikler vardır. Bu öznitelikler, .NET Core kitaplıklarında birçok ortak API 'ye uygulandı. Örneğin, IsNullOrEmpty güncelleştirilmiş ve derleyici bu yöntemi null denetim olarak doğru şekilde yorumlar. Null durum statik analizine uygulanan öznitelikler hakkında daha fazla bilgi için, null yapılabilir özniteliklersayfasındaki makaleye bakın.
Null yapılabilir bağlam ayarlanıyor
Null yapılabilir bağlamı denetlemek için iki yol vardır. Proje düzeyinde <Nullable>enable</Nullable> Proje ayarını ekleyebilirsiniz. Tek bir C# kaynak dosyasında, #nullable enable null yapılabilir bağlamı etkinleştirmek için pragma ekleyebilirsiniz. Null yapılabilir bir strateji ayarlamahakkında makaleye bakın. .NET 6 ' dan önce yeni projeler varsayılan ' i kullanır <Nullable>disable</Nullable> . .NET 6 ' dan başlayarak yeni projeler <Nullable>enable</Nullable> Proje dosyasındaki öğesini içerir.
C# dili belirtimi
Daha fazla bilgi için bkz. C# dil belirtimiiçin aşağıdaki teklifler: