Boş değer atanabilir başvuru türleri

Null atanabilir-belirsiz bir bağlamda, tüm başvuru türleri null atanabilirdi. Null atanabilir başvuru türleri , kodunuzun çalışma zamanının oluşturma System.NullReferenceExceptionolasılığını en aza indiren null atanabilir algılama bağlamında etkinleştirilen bir özellik grubunu ifade eder. Null atanabilir başvuru türleri, bir başvuru türünü null atanabilir olarak açıkça işaretleme özelliği de dahil olmak üzere bu özel durumlardan kaçınmanıza yardımcı olan üç özellik içerir:

  • Bir değişkenin başvuruyu kaldırmadan önce olup olmadığını null belirleyen geliştirilmiş statik akış analizi.
  • Akış analizinin null durumunu belirlemesi için API'lere ek açıklama ekleyen öznitelikler.
  • Geliştiricilerin bir değişken için hedeflenen null durumunu açıkça bildirmek için kullandığı değişken ek açıklamaları.

Derleyici, derleme zamanında kodunuzdaki her ifadenin null durumunu izler. Null durumunda üç değerden biri vardır:

  • not-null: İfadenin -olmadığınull bilinmektedir.
  • belki-null: İfade olabilir null.
  • oblivious: Derleyici ifadenin null durumunu belirleyemiyor.

Değişken ek açıklamaları, başvuru türü değişkeninin null atanabilirliğini belirler:

  • null atanamaz: Değişkene bir null değer veya belki null ifade atarsanız, derleyici bir uyarı verir. Null değer atanamayan değişkenlerin varsayılan null-durumu null değildir.
  • nullable: Değişkene bir null değer veya belki-null ifade atayabilirsiniz. Değişkenin null-durumu belki de null olduğunda, değişkenin başvurularını kaldırmanız durumunda derleyici bir uyarı verir. Değişkenin varsayılan null durumu belki-null'tır.
  • oblivious: Değişkene bir null değer veya belki null ifade atayabilirsiniz. Değişkenin başvurularını kaldırdığınızda veya değişkene belki-null ifade atadığınızda derleyici uyarı vermez.

Geçersiz null-durum ve belirsiz null atanabilirlik, null atanabilir başvuru türleri kullanılmadan önceki davranışla eşleşebilir. Bu değerler, geçiş sırasında veya uygulamanız null atanabilir başvuru türlerini etkinleştirmemiş bir kitaplık kullandığında yararlıdır.

Null durum çözümlemesi ve değişken ek açıklamaları mevcut projeler için varsayılan olarak devre dışı bırakılır; yani tüm başvuru türleri null atanabilir olmaya devam eder. .NET 6'dan başlayarak, bunlar yeni projeler için varsayılan olarak etkindir. Boş değer atanabilir bir ek açıklama bağlamı bildirerek bu özellikleri etkinleştirme hakkında bilgi için bkz . Null atanabilir bağlamlar.

Bu makalenin geri kalanında, kodunuz bir null değerin başvurularını kaldırıyor olabileceğinde bu üç özellik alanının uyarılar üretmek için nasıl çalıştığı açıklanmaktadır. Bir değişkenin başvurusunu kaldırma, aşağıdaki örnekte gösterildiği gibi (nokta) işlecini . kullanarak üyelerinden birine erişmek anlamına gelir:

string message = "Hello, World!";
int length = message.Length; // dereferencing "message"

değeri nullolan bir değişkenin başvurularını kaldırdığınızda, çalışma zamanı bir System.NullReferenceExceptionoluşturur.

Şu konularda bilgi edineceksiniz:

  • Derleyicinin null durum çözümlemesi: derleyicinin bir ifadenin null veya belki de null olup olmadığını nasıl belirlediği.
  • Derleyicinin null durum analizi için daha fazla bağlam sağlayan API'lere uygulanan öznitelikler.
  • Değişkenler için amacınız hakkında bilgi sağlayan null atanabilir değişken ek açıklamaları . Ek açıklamalar, üye yöntemlerinin başında varsayılan null durumunu ayarlamak için alanlar için kullanışlıdır.
  • Genel tür bağımsız değişkenlerini yöneten kurallar. Tür parametreleri başvuru türleri veya değer türleri olabileceği için yeni kısıtlamalar eklendi. Sonek ? , null atanabilir değer türleri ve null atanabilir başvuru türleri için farklı şekilde uygulanır.
  • Boş değer atanabilir bağlamlar büyük projeleri geçirmenize yardımcı olur. Geçişte uygulamanızın bazı bölümlerinde null atanabilir bağlamları veya uyarıları etkinleştirebilirsiniz. Daha fazla uyarıyı ele aldıktan sonra, tüm proje için null atanabilir başvuru türlerini etkinleştirebilirsiniz.

Son olarak, türlerde ve dizilerde struct null durum analizi için bilinen tuzakları öğrenirsiniz.

Bu kavramları C# dilinde Null atanabilir güvenlikle ilgili Learn modülümüzde de inceleyebilirsiniz.

null durum analizi

Null atanabilir başvuru türleri etkinleştirildiğinde, Null durum analizi başvuruların null durumunu izler. İfade null değil veya belki null olabilir. Derleyici, bir değişkenin null olmadığını iki şekilde belirler:

  1. Değişkene null olmadığı bilinen bir değer atanmıştır.
  2. Değişkene karşı null denetlendi ve bu denetimden sonra değiştirilmedi.

Null atanabilir başvuru türleri etkinleştirilmediğinde, tüm ifadelerin null durumu belirsiz olur. Bölümün geri kalanında, null atanabilir başvuru türleri etkinleştirildiğinde oluşan davranış açıklanır.

Derleyicinin null değil olarak belirlemediği herhangi bir değişken belki-null olarak kabul edilir. Analiz, yanlışlıkla bir null değer başvurusundan çıkarabileceğiniz durumlarda uyarılar sağlar. Derleyici, null durumuna göre uyarılar üretir.

  • Bir değişken null olmadığında, bu değişken güvenle başvurulabilir.
  • Değişken belki null olduğunda, bu değişkenin başvuruyu kaldırmadan önce olmadığından null emin olmak için bu değişkenin denetlenmesi gerekir.

Aşağıdaki örneği inceleyin:

string message = null;

// warning: dereference null.
Console.WriteLine($"The length of the message is {message.Length}");

var originalMessage = message;
message = "Hello, World!";

// No warning. Analysis determined "message" is not-null.
Console.WriteLine($"The length of the message is {message.Length}");

// warning!
Console.WriteLine(originalMessage.Length);

Yukarıdaki örnekte, derleyici ilk ileti yazdırıldığında bunun belki null olduğunu message belirler. İkinci ileti için uyarı yok. Kodun son satırı null olabileceğinden originalMessage bir uyarı oluşturur. Aşağıdaki örnekte, düğüm ağacını köke geçirerek geçiş sırasında her düğümü işlemek için daha pratik bir kullanım gösterilmektedir:

void FindRoot(Node node, Action<Node> processNode)
{
    for (var current = node; current != null; current = current.Parent)
    {
        processNode(current);
    }
}

Önceki kod, değişkeninin currentbaşvurularını kaldırmaya yönelik herhangi bir uyarı oluşturmaz. Statik analiz, belki-null olduğunda bunun hiçbir zaman başvurulmadığını belirlercurrent. Değişkene current erişim öncesinde current.Parent ve eyleme geçirilmeden current önce denetleniyor nullProcessNode. Önceki örneklerde, derleyicinin başlatıldığında, atandığında veya ile karşılaştırıldığında nullyerel değişkenler için null durumunu nasıl belirlediğini gösterir.

Null durum analizi, çağrılan yöntemlere iz bırakmaz. Sonuç olarak, tüm oluşturucular tarafından çağrılan ortak bir yardımcı yönteminde başlatılan alanlar aşağıdaki şablonla bir uyarı oluşturur:

Oluşturucudan çıkarken null değer atanamayan 'name' özelliği null olmayan bir değer içermelidir.

Bu uyarıları iki yoldan biriyle ele alabilirsiniz: Oluşturucu zincirleme veya yardımcı yönteminde null atanabilir öznitelikler . Aşağıdaki kodda her birinin bir örneği gösterilmektedir. sınıfı, Person diğer tüm oluşturucular tarafından çağrılan ortak bir oluşturucu kullanır. sınıfı, Student özniteliğiyle ek açıklamalı bir yardımcı yöntemine System.Diagnostics.CodeAnalysis.MemberNotNullAttribute sahiptir:


using System.Diagnostics.CodeAnalysis;

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public Person() : this("John", "Doe") { }
}

public class Student : Person
{
    public string Major { get; set; }

    public Student(string firstName, string lastName, string major)
        : base(firstName, lastName)
    {
        SetMajor(major);
    }

    public Student(string firstName, string lastName) :
        base(firstName, lastName)
    {
        SetMajor();
    }

    public Student()
    {
        SetMajor();
    }

    [MemberNotNull(nameof(Major))]
    private void SetMajor(string? major = default)
    {
        Major = major ?? "Undeclared";
    }
}

Not

C# 10'a kesin atama ve null durum analizinde bir dizi iyileştirme eklendi. C# 10'a yükselttiğiniz zaman, hatalı pozitif olan daha az null atanabilir uyarı bulabilirsiniz. Belirli atama geliştirmeleri için özellikler belirtimindeki geliştirmeler hakkında daha fazla bilgi edinebilirsiniz.

Null atanabilir durum analizi ve derleyicinin oluşturduğu uyarılar, başvurularını nullkaldırarak program hatalarını önlemenize yardımcı olur. Null atanabilir uyarıları çözme makalesi, kodunuzda büyük olasılıkla görülen uyarıları düzeltmeye yönelik teknikler sağlar.

API imzalarında öznitelikler

Null durum analizi, API'lerin semantiğini anlamak için geliştiricilerin ipuçlarına ihtiyaç duyar. Bazı API'ler null denetimler sağlar ve değişkenin null durumunu belki-null yerine not-nullolarak değiştirmelidir. Diğer API'ler, giriş bağımsız değişkenlerinin nulldurumuna bağlı olarak null veya belki null olmayan ifadeler döndürür. Örneğin, büyük harfle bir ileti görüntüleyen aşağıdaki kodu göz önünde bulundurun:

void PrintMessageUpper(string? message)
{
    if (!IsNull(message))
    {
        Console.WriteLine($"{DateTime.Now}: {message.ToUpper()}");
    }
}

bool IsNull(string? s) => s == null;

İncelemeye bağlı olarak, herhangi bir geliştirici bu kodu güvenli olarak değerlendirir ve uyarı oluşturmamalıdır. Ancak derleyici, null denetimi sağladığını IsNull bilmez ve belki-null değişkeni olarak kabul ederek message deyimi için message.ToUpper() bir uyarı verir. Bu uyarıyı NotNullWhen düzeltmek için özniteliğini kullanın:

bool IsNull([NotNullWhen(false)] string? s) => s == null;

Bu öznitelik derleyiciyi döndürürse IsNullfalseparametresinin s null olmadığını bildirir. Derleyici, bloğun içinde if (!IsNull(message)) {...} null durumunumessagenot-null olarak değiştirir. Uyarı verilmedi.

Öznitelikler bağımsız değişkenlerin null durumu, dönüş değerleri ve üye çağırmak için kullanılan nesne örneğinin üyeleri hakkında ayrıntılı bilgi sağlar. Her öznitelikle ilgili ayrıntılar, null atanabilir başvuru öznitelikleriyle ilgili dil başvurusu makalesinde bulunabilir. .NET 5 itibarıyla tüm .NET çalışma zamanı API'lerine açıklama eklenir. Bağımsız değişkenlerin ve dönüş değerlerinin null durumu hakkında anlam bilgisi sağlamak için API'lerinize açıklama ekleyerek statik analizi geliştirirsiniz.

Boş değer atanabilir değişken ek açıklamaları

Null durum analizi, yerel değişkenler için güçlü analiz sağlar. Derleyicinin üye değişkenleri için sizden daha fazla bilgi alması gerekir. Derleyici, bir üyenin açılış köşeli ayracındaki tüm alanların null durumunu ayarlamak için daha fazla bilgiye ihtiyaç duyar. Erişilebilir oluşturuculardan herhangi biri nesneyi başlatmak için kullanılabilir. Bir üye alanı olarak ayarlanabilirsenull, derleyicinin her yöntemin başında null durumunun belki de null olduğunu varsayması gerekir.

Bir değişkenin null atanabilir başvuru türü mü yoksa null atanamaz başvuru türümü olduğunu bildirebilen ek açıklamalar kullanırsınız. Bu ek açıklamalar, değişkenler için null durumu hakkında önemli deyimler yapar:

  • Başvuru null olmamalıdır. Null değer atanamayan başvuru değişkeninin varsayılan durumu null değildir. Derleyici, önce null olmadığını denetlemeden bu değişkenlere başvurmanın güvenli olmasını sağlayan kurallar uygular:
    • Değişkenin null olmayan bir değere başlatılması gerekir.
    • değişkenine hiçbir zaman değeri nullatanamıyor. Kod null olmaması gereken bir değişkene belki-null ifadesi atadığında derleyici bir uyarı döndürür.
  • Başvuru null olabilir. Null atanabilir başvuru değişkeninin varsayılan durumu belki-null'tır. Derleyici, bir başvuruyu doğru şekilde null denetlediğinizden emin olmak için kuralları zorlar:
    • Değişken yalnızca derleyici değerin olmadığını garanti ettiğinde başvurulabilir null.
    • Bu değişkenler varsayılan null değerle başlatılabilir ve değeri başka bir kodda atanabilir null .
    • Kod null olabilecek bir değişkene belki-null ifadesi atadığında derleyici uyarı vermez.

Boş değer atanamayan başvuru değişkenlerinin varsayılan null durumu null değildir. Boş değer atanabilir başvuru değişkenlerinin ilk null durumubelki-null olur.

Null atanabilir başvuru türü, null atanabilir değer türleriyle aynı söz dizimi kullanılarak belirtilir: değişkenin türüne a ? eklenir. Örneğin, aşağıdaki değişken bildirimi null atanabilir dize değişkenini temsil eder: name

string? name;

Null atanabilir başvuru türleri etkinleştirildiğinde, tür adına eklenmeyen herhangi bir değişken ? null atanamaz bir başvuru türüdür. Bu özellik etkinleştirildikten sonra mevcut koddaki tüm başvuru türü değişkenlerini içerir. Ancak, örtük olarak yazılan tüm yerel değişkenler (kullanılarak varbildirilir) null atanabilir başvuru türleridir. Önceki bölümlerde gösterildiği gibi statik analiz, yerel değişkenlerin başvurularını kaldırmadan önce belki null olup olmadığını belirlemek için null durumunu belirler.

Bazen bir değişkenin null olmadığını bildiğiniz ancak derleyicinin null durumunun belki null olduğunu belirlediğinde uyarıyı geçersiz kılmanız gerekir. null-forgiving işlecini null-forgiving işlecini! bir değişken adıyla kullanarak null durumunu null olmayan duruma zorlarsınız. Örneğin, değişkenin name olmadığını null ancak derleyicinin bir uyarı vermediğini biliyorsanız, derleyicinin çözümlemesini geçersiz kılmak için aşağıdaki kodu yazabilirsiniz:

name!.Length;

Null atanabilir başvuru türleri ve null atanabilir değer türleri benzer bir anlam kavramı sağlar: Bir değişken bir değeri veya nesneyi temsil edebilir veya bu değişken olabilir null. Ancak, null atanabilir başvuru türleri ve null atanabilir değer türleri farklı uygulanır: null atanabilir değer türleri kullanılarak System.Nullable<T>uygulanır ve null atanabilir başvuru türleri derleyici tarafından okunan öznitelikler tarafından uygulanır. Örneğin ve string?string her ikisi de aynı türle temsil edilir: System.String. Ancak ve int?int sırasıyla ve System.Int32ile System.Nullable<System.Int32> temsil edilir.

Boş değer atanabilir başvuru türleri bir derleme zamanı özelliğidir. Bu, çağıranların uyarıları yoksayıp, null atanamayan başvuru bekleyen bir yöntemin bağımsız değişkeni olarak kasıtlı olarak kullanabilecekleri null anlamına gelir. Kitaplık yazarları null bağımsız değişken değerlerine karşı çalışma zamanı denetimleri içermelidir. ArgumentNullException.ThrowIfNull, çalışma zamanında bir parametreyi null değere karşı denetlemek için tercih edilen seçenektir.

Önemli

Boş değer atanabilir ek açıklamaların etkinleştirilmesi, Entity Framework Core'un veri üyesi gerekip gerekmediğini belirleme biçimini değiştirebilir. Entity Framework Core Fundamentals: Working with Nullable Reference Types makalesinde daha fazla bilgi edinebilirsiniz.

Genel Türler

Genel değerler, herhangi bir tür parametresi Tiçin işlemek T? üzere ayrıntılı kurallar gerektirir. Null atanabilir bir değer türü ve null atanabilir başvuru türü için geçmiş ve farklı uygulama nedeniyle kurallar mutlaka ayrıntılıdır. Null atanabilir değer türleri yapısı kullanılarak System.Nullable<T> uygulanır. Null atanabilir başvuru türleri , derleyiciye anlam kuralları sağlayan tür ek açıklamaları olarak uygulanır.

  • için T tür bağımsız değişkeni bir başvuru türüyse, T? karşılık gelen null atanabilir başvuru türüne başvurur. Örneğin, bir stringiseT, bir T? olurstring?.
  • için T tür bağımsız değişkeni bir değer türüyse, T? aynı değer türüne başvurur. T Örneğin, bir ise Tint, T? aynı zamanda bir intolur.
  • için T tür bağımsız değişkeni null atanabilir bir başvuru türüyse, T? aynı null atanabilir başvuru türüne başvurur. Örneğin, bir iseT, T? aynı zamanda bir string?olur.string?
  • için T tür bağımsız değişkeni null atanabilir bir değer türüyse, T? aynı null atanabilir değer türüne başvurur. Örneğin, bir iseT, T? aynı zamanda bir int?olur.int?

Dönüş değerleri için[MaybeNull]T, T? ile eşdeğerdir; bağımsız değişken değerleri için ile T? eşdeğerdir[AllowNull]T. Daha fazla bilgi için dil başvurusunda null durum analizi için öznitelikler makalesine bakın.

Kısıtlamaları kullanarak farklı davranışlar belirtebilirsiniz:

  • Kısıtlama, class bunun T null değer atanamayan bir başvuru türü (örneğin string) olması gerektiği anlamına gelir. için gibi string?Tnull atanabilir bir başvuru türü kullanırsanız derleyici bir uyarı üretir.
  • Kısıtlama class? , bunun T null atanamaz () veya null atanabilir başvuru türü (stringörneğin string?) bir başvuru türü olması gerektiği anlamına gelir. tür parametresi gibi string?null atanabilir bir başvuru türü olduğunda, gibi aynı null atanabilir başvuru türüne string?sahip başvuruların T? ifadesidir.
  • Kısıtlama notnull , boş T değer atanamayan bir başvuru türü veya null atanamayan bir değer türü olması gerektiği anlamına gelir. tür parametresi için null atanabilir bir başvuru türü veya null atanabilir bir değer türü kullanırsanız, derleyici bir uyarı üretir. Ayrıca, bir değer türü olduğunda T , döndürülen değer karşılık gelen null atanabilir değer türü değil, bu değer türüdür.

Bu kısıtlamalar, derleyiciye nasıl T kullanıldığı hakkında daha fazla bilgi sağlamaya yardımcı olur. Bu, geliştiricilerin türünü seçmesine ve genel türün T bir örneği kullanıldığında daha iyi null durum analizi sağlamasına yardımcı olur.

Boş değer atanabilir bağlamlar

Küçük projeler için null atanabilir başvuru türlerini etkinleştirebilir, uyarıları düzeltebilir ve devam edebilirsiniz. Ancak, çok sayıda uyarı oluşturabilecek daha büyük projeler ve çok projeli çözümler için. Null değer atanabilir başvuru türlerini kullanmaya başladığınızda dosyaya göre null atanabilir başvuru türlerini etkinleştirmek için pragmaları kullanabilirsiniz. Oluşturmaya System.NullReferenceException karşı koruma sağlayan yeni özellikler, mevcut bir kod tabanında açıldığında kesintiye neden olabilir:

  • Açıkça yazılan tüm başvuru değişkenleri null atanamayan başvuru türleri olarak yorumlanır.
  • Genel türlerdeki kısıtlamanın class anlamı, null atanamayan başvuru türü anlamına geliyor olarak değiştirildi.
  • Bu yeni kurallar nedeniyle yeni uyarılar oluşturulur.

Null atanabilir ek açıklama bağlamı , derleyicinin davranışını belirler. Null atanabilir ek açıklama bağlamı için dört değer vardır:

  • disable: Kod nullable-oblivious. Yeni söz diziminin hatalar yerine uyarılar üretmesi dışında, devre dışı bırak seçeneği null atanabilir başvuru türleri etkinleştirilmeden önceki davranışla eşleşir.
    • Null atanabilir uyarılar devre dışı bırakıldı.
    • Tüm başvuru türü değişkenleri null atanabilir başvuru türleridir.
    • Son ekin ? null atanabilir başvuru türü bildirmek için kullanılması bir uyarı oluşturur.
    • null forgiving işlecini kullanabilirsiniz, !ancak hiçbir etkisi yoktur.
  • enable: Derleyici tüm null başvuru analizini ve tüm dil özelliklerini etkinleştirir.
    • Tüm yeni null atanabilir uyarılar etkinleştirilir.
    • Son eki kullanarak ? null atanabilir bir başvuru türü bildirebilirsiniz.
    • Son eki olmayan ? başvuru türü değişkenleri null atanamaz başvuru türleridir.
    • Null forgiving işleci, için olası atama nulluyarılarını gizler.
  • uyarılar: Derleyici tüm null çözümlemelerini gerçekleştirir ve kodun başvurulmayabileceği nulldurumlarda uyarı verir.
    • Tüm yeni null atanabilir uyarılar etkinleştirilir.
    • Son ekin ? null atanabilir başvuru türü bildirmek için kullanılması bir uyarı oluşturur.
    • Tüm başvuru türü değişkenlerinin null olması gerekir. Ancak, sonek ile ? bildirilmediği sürece, üyeler tüm yöntemlerin açılış küme ayracında null-değil-null durumuna sahiptir.
    • null forgiving işlecini kullanabilirsiniz. !
  • ek açıklamalar: Derleyici, kodun başvuruyu kaldırabileceği nullveya null olmayan bir değişkene belki-null ifade atadığınızda uyarı göndermez.
    • Tüm yeni null atanabilir uyarılar devre dışı bırakılır.
    • Son eki kullanarak ? null atanabilir bir başvuru türü bildirebilirsiniz.
    • Son eki olmayan ? başvuru türü değişkenleri null atanamaz başvuru türleridir.
    • null forgiving işlecini kullanabilirsiniz, !ancak hiçbir etkisi yoktur.

.csproj dosyanızdaki öğesi kullanılarak <Nullable> bir proje için null atanabilir ek açıklama bağlamı ve null atanabilir uyarı bağlamı ayarlanabilir. Bu öğe, derleyicinin türlerin null atanabilirliğini nasıl yorumlayıp hangi uyarıların yayılıyor olduğunu yapılandırıyor. Aşağıdaki tabloda izin verilebilen değerler gösterilir ve bu değerlerin belirttiği bağlamlar özetler.

Bağlam Başvuru kaldırma uyarıları Atama uyarıları Referans türleri ? Soneki ! Işleç
disable Devre Dışı Devre Dışı Tümü null atanabilir Uyarı oluşturur Etkisi yok
enable Etkin Etkin ile bildirilmediği sürece null atanamaz ? Null atanabilir türü bildirir Olası null atama için uyarıları gizler
warnings Etkin Uygulanamaz Tümü null değer atanabilir, ancak yöntemlerin küme ayracı açılırken üyeler null değil olarak kabul edilir Uyarı oluşturur Olası null atama için uyarıları gizler
annotations Devre Dışı Devre Dışı ile bildirilmediği sürece null atanamaz ? Null atanabilir türü bildirir Etkisi yok

Devre dışı bırakılmış bir bağlamda derlenen koddaki başvuru türü değişkenleri null atanabilir-belirsizdir. Null değer atanabilir-belirsiz bir değişkene değişmez değer veya belki null değişken atayabilirsiniznull. Ancak, null atanabilir-belirsiz bir değişkenin varsayılan durumu null değildir.

Projeniz için en uygun ayarı seçebilirsiniz:

  • Tanılamaya veya yeni özelliklere göre güncelleştirmek istemediğiniz eski projeler için devre dışı bırak'ı seçin.
  • Kodunuzun nereye atabileceğini System.NullReferenceExceptionbelirlemek için uyarıları seçin. Boş değer atanamayan başvuru türlerini etkinleştirmek için kodu değiştirmeden önce bu uyarıları ele alabilirsiniz.
  • Uyarıları etkinleştirmeden önce tasarım amacınızı ifade etmek için ek açıklamaları seçin.
  • Null başvuru özel durumlarına karşı korumak istediğiniz yeni projeler ve etkin projeler için etkinleştir'i seçin.

Örnek:

<Nullable>enable</Nullable>

Bu bağlamları kaynak kodunuzun herhangi bir yerinde ayarlamak için yönergeleri de kullanabilirsiniz. Bu yönergeler en çok büyük bir kod tabanını geçirirken kullanışlıdır.

  • #nullable enable: Etkinleştirmek için null atanabilir ek açıklama bağlamını ve null atanabilir uyarı bağlamını ayarlar.
  • #nullable disable: Boş değer atanabilir ek açıklama bağlamını ve null atanabilir uyarı bağlamını devre dışı bırakacak şekilde ayarlar.
  • #nullable restore: Null atanabilir ek açıklama bağlamını ve null atanabilir uyarı bağlamını proje ayarlarına geri yükler.
  • #nullable disable warnings: Devre dışı bırakmak için null atanabilir uyarı bağlamını ayarlayın.
  • #nullable enable warnings: Etkinleştirmek için null atanabilir uyarı bağlamını ayarlayın.
  • #nullable restore warnings: Null atanabilir uyarı bağlamını proje ayarlarına geri yükler.
  • #nullable disable annotations: Devre dışı bırakmak için null atanabilir ek açıklama bağlamını ayarlayın.
  • #nullable enable annotations: Etkinleştirmek için null atanabilir ek açıklama bağlamını ayarlayın.
  • #nullable restore annotations: Ek açıklama uyarı bağlamını proje ayarlarına geri yükler.

Herhangi bir kod satırı için aşağıdaki birleşimlerden herhangi birini ayarlayabilirsiniz:

Uyarı bağlamı Ek açıklama bağlamı Kullanma
project default project default Varsayılan
Etkinleştirmek devre dışı bırakma Analiz uyarılarını düzeltme
Etkinleştirmek project default Analiz uyarılarını düzeltme
project default Etkinleştirmek Tür ek açıklamaları ekleme
Etkinleştirmek Etkinleştirmek Kod zaten geçirildi
devre dışı bırakma Etkinleştirmek Uyarıları düzeltmeden önce koda ek açıklama ekleme
devre dışı bırakma devre dışı bırakma Geçirilen projeye eski kod ekleme
project default devre dışı bırakma Nadiren
devre dışı bırakma project default Nadiren

Bu dokuz birleşim, derleyicinin kodunuz için yaydığı tanılamalar üzerinde ayrıntılı denetim sağlar. Henüz ele almak için hazır olmadığınız daha fazla uyarı görmeden, güncelleştirdiğiniz herhangi bir alanda daha fazla özellik etkinleştirebilirsiniz.

Önemli

Genel null atanabilir bağlam, oluşturulan kod dosyaları için geçerli değildir. Her iki stratejide de, oluşturulan olarak işaretlenmiş tüm kaynak dosyalarda null atanabilir bağlam devre dışı bırakılır . Bu, oluşturulan dosyalardaki API'lere açıklama eklenmediği anlamına gelir. Bir dosyanın oluşturuldu olarak işaretlenmesinin dört yolu vardır:

  1. .editorconfig içinde, bu dosyaya uygulanan bir bölümde belirtin generated_code = true .
  2. Dosyanın en üstüne bir açıklama ekleyin <auto-generated> veya <auto-generated/> ekleyin. Bu açıklamadaki herhangi bir satırda olabilir, ancak açıklama bloğu dosyadaki ilk öğe olmalıdır.
  3. Dosya adını TemporaryGeneratedFile_ ile başlatma
  4. Dosya adını .designer.cs, .generated.cs, .g.cs veya .g.i.cs ile sonlandırın.

Oluşturucular ön işlemci yönergesini #nullable kullanarak kabul edebilir.

Varsayılan olarak, null atanabilir ek açıklama ve uyarı bağlamları devre dışı bırakılır. Bu, mevcut kodunuzun değişiklik yapmadan ve yeni uyarı oluşturmadan derlenmesi anlamına gelir. .NET 6 ile başlayarak, yeni projeler tüm proje şablonlarında <Nullable>enable</Nullable> öğesini içerir.

Bu seçenekler, mevcut bir kod tabanını null atanabilir başvuru türlerini kullanacak şekilde güncelleştirmek için iki farklı strateji sağlar.

Bilinen tuzaklar

Başvuru türleri içeren diziler ve yapılar, null atanabilir başvurularda ve null güvenliği belirleyen statik analizde bilinen tuzaklardır. Her iki durumda da, uyarı oluşturmadan için null atanamaz bir başvuru başlatılabilir null.

Yapılar

Null değer atanamayan başvuru türleri içeren bir yapı, herhangi bir uyarı olmadan atanmasına default izin verir. Aşağıdaki örneği inceleyin:

using System;

#nullable enable

public struct Student
{
    public string FirstName;
    public string? MiddleName;
    public string LastName;
}

public static class Program
{
    public static void PrintStudent(Student student)
    {
        Console.WriteLine($"First name: {student.FirstName.ToUpper()}");
        Console.WriteLine($"Middle name: {student.MiddleName?.ToUpper()}");
        Console.WriteLine($"Last name: {student.LastName.ToUpper()}");
    }

    public static void Main() => PrintStudent(default);
}

Yukarıdaki örnekte, null atanamayan başvuru türleri FirstName ve LastName null olduğunda içinde uyarı PrintStudent(default) yoktur.

Daha yaygın bir diğer durum da genel yapılarla ilgilenmenizdir. Aşağıdaki örneği inceleyin:

#nullable enable

public struct S<T>
{
    public T Prop { get; set; }
}

public static class Program
{
    public static void Main()
    {
        string s = default(S<string>).Prop;
    }
}

Yukarıdaki örnekte özelliği Prop çalışma zamanındadır null . Hiçbir uyarı olmadan null atanamaz dizeye atanır.

Diziler

Diziler, null atanabilir başvuru türlerinde de bilinen bir tuzaktır. Hiçbir uyarı üretmeyen aşağıdaki örneği göz önünde bulundurun:

using System;

#nullable enable

public static class Program
{
    public static void Main()
    {
        string[] values = new string[10];
        string s = values[0];
        Console.WriteLine(s.ToUpper());
    }
}

Yukarıdaki örnekte, dizinin bildirimi, öğelerinin tümü olarak başlatılırken nullnull atanamaz dizeler içerdiğini gösterir. Ardından değişkene s bir null değer (dizinin ilk öğesi) atanır. Son olarak değişken s başvurulmadan çalışma zamanı özel duruma neden olur.

Ayrıca bkz.