Boş değer atanabilir başvuru türleri (C# başvurusu)

Not

Bu makale null atanabilir başvuru türlerini kapsar. Null atanabilir değer türlerini de bildirebilirsiniz.

Null atanabilir başvuru türleri, null atanabilir bir tanıma bağlamı seçen kodda kullanılabilir. 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. Null atanabilir bağlam , derleme ayarları kullanılarak proje düzeyinde veya pragmalar kullanılarak kodda denetlenebilir.

Önemli

.NET 6 (C# 10) ile başlayan 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ündeki T bir değişken null olmayan bir değerle başlatılmalıdır ve hiçbir zaman değeri atanmamalıdır null.
  • Başvuru türündeki T? bir değişken ile null başlatılabilir veya atanabilir null, ancak başvurunun kaldırılmadan önce denetlenebilmesi null gerekir.
  • türünde T? bir değişkenm, içinde olduğu gibi null-forgiving işlecini uyguladığınızda null olmayan olarak m!kabul edilir.

Null değer atanamayan başvuru türü ile null atanabilir başvuru türü TT? arasındaki ayrımlar, derleyicinin yukarıdaki kuralları yorumlaması tarafından zorlanır. Türünde T bir değişken ve türündeki T? bir değişken aynı .NET türüyle temsil edilir. 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

ve nullable değişkenleri notNull türüyle String temsil edilir. Null atanamaz ve null atanabilir türler aynı tür olarak depolandığından, null atanabilir başvuru türü kullanılmasına izin verilmeyen birkaç konum vardır. Genel olarak, null atanabilir başvuru türü temel sınıf veya uygulanan arabirim olarak kullanılamaz. Boş değer atanabilir başvuru türü hiçbir nesne oluşturma veya tür testi ifadesinde kullanılamaz. Null atanabilir başvuru türü, üye erişim ifadesinin türü olamaz. 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.

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şkenler bildirildikleri yere atanmalıdır. 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şkenler başvurulduğunda 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ürleri başlatılabilir veya öğesine nullatanabilir. Bu nedenle statik analiz, bir değişkenin başvurulmadan önce null olmadığını belirlemelidir. Null atanabilir bir başvuru belki-null olarak belirlenirse, null atanamaz başvuru değişkenine atanması 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 ekleyebileceğiniz öznitelikler vardır. Bu öznitelikler .NET Core kitaplıklarındaki birçok yaygın API'ye uygulanmıştır. Örneğin, IsNullOrEmpty güncelleştirildi ve derleyici bu yöntemi null denetim olarak doğru yorumlar. Null durum statik analizine uygulanan öznitelikler hakkında daha fazla bilgi için Null atanabilir öznitelikler makalesine bakın.

Null atanabilir bağlamı ayarlama

Boş değer atanabilir bağlamı denetlemenin iki yolu vardır. Proje düzeyinde proje ayarını ekleyebilirsiniz <Nullable>enable</Nullable> . Tek bir C# kaynak dosyasında, null atanabilir bağlamı #nullable enable etkinleştirmek için pragmasını ekleyebilirsiniz. Boş değer atanabilir strateji ayarlama makalesine bakın. .NET 6'nın öncesinde, yeni projeler varsayılan <Nullable>disable</Nullable>olan öğesini 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 belirtimi için aşağıdaki tekliflere bakın:

Ayrıca bkz.