Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Bu makale null atanabilir başvuru türlerini kapsar. Null atanabilir değer türlerini de bildirebilirsiniz.
Null değer atanabilir algılama bağlamındaki kodda null atanabilir başvuru türlerini kullanabilirsiniz. Null atanabilir başvuru türleri, null statik analiz uyarıları ve null-forgiving işleci isteğe bağlı dil özellikleridir. Tümü varsayılan olarak kapalıdır. Derleme ayarlarını kullanarak proje düzeyinde veya pragmalar kullanarak kodda null atanabilir bağlamı denetleyebilirsiniz.
C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.
Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.
Tavsiye
Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.
Önemli
Tüm proje şablonları, proje için null atanabilir bağlam etkinleştirir. Önceki şablonlarla oluşturulan projeler bu öğeyi içermez ve bunları proje dosyasında etkinleştirmediğiniz veya pragmaları kullanmadığınız sürece bu özellikler kapalıdır.
Null değer atanabilir bir tanıma bağlamında:
- Başvuru türünün
Tdeğişkenini null olmayan bir değerle başlatmanız gerekir ve olabilecek bir değerinullhiçbir zaman atayamamalısınız. - ile
nullbir başvuru türününT?değişkenini başlatabilir veya atayabilirsiniznull, ancak başvuruyu kaldırmadan önce değişkeniylenullkarşılaştırmalısınız. - türünde bir değişkene
mT?m!null-forgiving işlecini uyguladığınızda, değişkeni null olmayan olarak kabul edilir.
Derleyici, önceki kuralları kullanarak null atanamayan bir başvuru türü T ile null atanabilir başvuru türü T? arasındaki ayrımları zorlar.
T türünde bir değişken ve T? türündeki bir değişken aynı .NET türündedir. Aşağıdaki örnek null atanamayan bir dize ve null atanabilir bir dize bildirir ve ardından null atanamaz bir dizeye değer atamak için null-forgiving 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ünü kullanır String . Null atanamaz ve null atanabilir türlerin her ikisi de aynı türü kullandığından, birkaç konumda null atanabilir başvuru türü kullanamazsınız. Genel olarak, null atanabilir başvuru türünü temel sınıf veya uygulanan arabirim olarak kullanamazsınız. Hiçbir nesne oluşturma veya tür testi ifadesinde null atanabilir başvuru türü kullanamazsınız. Üye erişim ifadesinin türü olarak null atanabilir başvuru türünü kullanamazsınız. Aşağıdaki örneklerde şu 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");
}
Boş değer atanabilir başvurular ve statik analiz
Önceki bölümdeki örneklerde null atanabilir başvuru türlerinin yapısı gösterilmektedir. Null atanabilir başvuru türleri yeni sınıf türleri değil, mevcut başvuru türlerinde ek açıklamalardır. Derleyici, kodunuzda olası null başvuru hatalarını bulmanıza yardımcı olması için bu ek açıklamaları kullanır. Boş değer atanamayan başvuru türü ile null atanabilir başvuru türü arasında çalışma zamanı farkı yoktur. Derleyici, boş değer atanamayan başvuru türleri için çalışma zamanı denetimi eklemez. Avantajları, derleme zamanı analizindedir. Derleyici, kodunuzdaki olası null hataları bulmanıza ve düzeltmenize yardımcı olacak uyarılar oluşturur. Amacınızı bildirirsiniz ve kodunuz bu amacı ihlal ettiğinde derleyici sizi uyarır.
Önemli
Null atanabilir başvuru ek açıklamaları davranış değişikliklerine neden olmaz, ancak diğer kitaplıklar null atanabilir ve null atanamayan başvuru türleri için farklı çalışma zamanı davranışı oluşturmak için yansıma kullanabilir. Özellikle, Entity Framework Core null atanabilir öznitelikleri okur. Null başvuru isteğe bağlı bir değer, null olmayan başvuru ise gereken bir değer olarak yorumlanır.
Boş değer atanabilir bir bağlamda, derleyici herhangi bir başvuru türündeki değişkenler üzerinde hem null atanabilir hem de null atanamaz statik analiz gerçekleştirir. Derleyici, her başvuru değişkeninin null durumunu not-null veya belki-null olarak izler. Null değer atanamayan bir başvurunun varsayılan durumu null değil. Null atanabilir başvurunun varsayılan durumu belki-null'tır.
Null-durumu null olmadığından, null atanamayan başvuru türlerinin başvurularının geri alınması her zaman güvenli olmalıdır. Bu kuralı zorunlu kılmak için, null olmayan bir başvuru türü null olmayan bir değere başlatılmazsa derleyici uyarılar verir. Yerel değişkenleri bildirdiğiniz yere atamanız gerekir. Her alana bir alan başlatıcıda veya her oluşturucuda null olmayan bir değer atanmalıdır. Derleyici, durumu belki-null olan bir başvuruya null olmayan bir başvuru atandığında uyarılar döndürür. Genellikle, null atanamayan bir başvuru null değildir ve bu değişkenlere başvuruyu kaldırdığınızda hiçbir uyarı verilmez.
Not
Null değer atanamayan bir başvuru türüne belki-null ifadesi atarsanız, derleyici bir uyarı oluşturur. Derleyici daha sonra bu değişken null olmayan bir ifadeye atanana kadar bu değişken için uyarılar oluşturur.
Null atanabilir başvuru türlerini başlatabilir veya atayabilirsiniz null . Bu nedenle statik analiz, bir değişkenin başvurulmadan önce null olmadığını belirlemelidir. Null atanabilir başvuru belki null olarak belirlenirse, bunu null atanamaz bir başvuru değişkenine atamak 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ığı, bu sınıfı kullanırken derleyicinin uyarıları nereye yaydığı gösterir:
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ğini göstermektedir. Derleyici, çözümlemesini bilgilendirmek için null denetimler ve atamalar için dil kuralları uygular. Derleyici, yöntemlerin veya özelliklerin semantiği hakkında varsayımlarda bulunamaz. Null denetimler gerçekleştiren yöntemleri çağırırsanız, derleyici bu yöntemlerin bir değişkenin null durumunu etkilediğini bilemez. Derleyiciyi bağımsız değişkenlerin semantiği ve dönüş değerleri hakkında bilgilendirmek için API'lerinize öznitelikler ekleyebilirsiniz. .NET kitaplıklarındaki birçok yaygın API'nin bu öznitelikleri vardır. Örneğin, derleyici IsNullOrEmpty'ı null kontrolü olarak doğru bir şekilde yorumlamaktadır. Null durum statik analizine uygulanan öznitelikler hakkında daha fazla bilgi için Null atanabilir öznitelikler makalesine bakın.
Null atanabilir bağlamı ayarlama
Null atanabilir bağlamı iki şekilde denetleyebilirsiniz. Proje düzeyinde proje ayarını ekleyin <Nullable>enable</Nullable> . Tek bir C# kaynak dosyasında, null atanabilir bağlamı #nullable enable etkinleştirmek için pragmasını ekleyin. Boş değer atanabilir strateji ayarlama makalesine bakın. .NET 6'nın öncesinde, yeni projeler varsayılan <Nullable>disable</Nullable>kullanır. .NET 6 ile başlayarak, yeni projeler proje dosyasında öğesini içerir <Nullable>enable</Nullable> .
C# dili belirtimi
Daha fazla bilgi için C# dil belirtimininNull atanabilir başvuru türleri bölümüne bakın.