0Pricing
C# Academy · Ders

Ek Açıklamalar: ?, !, MaybeNull ve NotNull

Nullable türler için ? işaretini, null'ı yok saymak için ! işaretini, kesin akış analizi için MaybeNull ve NotNullWhen gibi öznitelikleri kullanın.

Ek Açıklamalar: ?, !, MaybeNull ve NotNull, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

? ve ! Ötesi: Null Olabilirlik Öznitelikleri

Temel ? özniteliği ve null denetimi çoğu durumu ele alır; ancak bazı kalıplar daha ifade gücü yüksek öznitelikler gerektirir. System.Diagnostics.CodeAnalysis ad alanı, derleyiciye null akışı hakkında daha ayrıntılı bilgi veren öznitelikler sağlar.

MaybeNull ve NotNull

[MaybeNull], null kabul etmeyen bir dönüş türünün uygulamada gerçekte null olabileceğini derleyiciye bildirir (örneğin genel bir yöntemde). [NotNull] ise nullable bir parametrenin çağrıdan sonra null olmayacağını garanti eder.

using System.Diagnostics.CodeAnalysis;

// [MaybeNull]: return might be null even though T is non-nullable
[return: MaybeNull]
public T Find<T>(int id)
{
    // Returns default(T) which is null for reference types
    return _cache.TryGetValue(id, out var val) ? val : default!;
}

// [NotNull]: after this call, output is guaranteed non-null
public static void EnsureNotNull<T>(
    [NotNull] ref T? value,
    T defaultValue) where T : class
{
    value ??= defaultValue;
}

NotNullWhen: Koşullu Null Olmama

[NotNullWhen(true)], derleyiciye bir çıktı parametresinin yöntem true döndürdüğünde null olmadığını bildirir. Standart TryParse kalıbı bu şekilde özniteliklendirilir.

using System.Diagnostics.CodeAnalysis;

public static bool TryParseEmail(
    string? input,
    [NotNullWhen(true)] out string? email)
{
    if (input?.Contains('@') == true)
    {
        email = input.Trim().ToLower();
        return true;
    }
    email = null;
    return false;
}

// Usage — no warning after true check:
if (TryParseEmail(raw, out var email))
    Console.WriteLine(email.Length); // safe — email is non-null here

MaybeNullWhen: Koşullu Null Olma

[MaybeNullWhen(false)] bunun tersidir; yöntem false döndürdüğünde çıktının null olabileceğini belirtir. Sözlüklerdeki TryGetValue kalıplarında kullanılır.

// This is how Dictionary<K,V>.TryGetValue is annotated:
public bool TryGetValue(
    TKey key,
    [MaybeNullWhen(false)] out TValue value)
{ ... }

// Usage:
if (!dict.TryGetValue("key", out var value))
    return; // early return — value is null in this branch

Console.WriteLine(value.Length); // safe after the guard

AllowNull ve DisallowNull

Null kabul etmeyen bir özelliğin üzerine eklenen [AllowNull], çağıranların bu özelliğe null geçirmesine izin verir (örneğin null değerini boş dizeye dönüştüren bir ayarlayıcıda). [DisallowNull] ise nullable bir türde null değerini yasaklar.

public class Config
{
    private string _name = "";

    // Allow setting null (setter converts null -> empty)
    [AllowNull]
    public string Name
    {
        get => _name;
        set => _name = value ?? "";
    }

    // Getter always returns non-null: fine
    // Setter accepts null: [AllowNull] tells compiler that's OK
}

NotNullIfNotNull: Null Olabilirliği Aktarma

[NotNullIfNotNull(paramName)] şunu belirtir: X parametresi null değilse dönüş değeri de null değildir. Dönüştürme işlevleri için kullanışlıdır.

[return: NotNullIfNotNull(nameof(value))]
public static string? Normalize(string? value)
{
    return value?.Trim().ToLower();
}

// Usage:
string  name = "  Alice  ";
string  norm1 = Normalize(name)!; // guaranteed non-null
string? raw   = GetRaw();
string? norm2 = Normalize(raw);   // still nullable (raw might be null)

DoesNotReturn

[DoesNotReturn], her zaman özel durum fırlatan bir yöntemi işaretler. Derleyici, çağrıdan sonraki kodun erişilemez olduğunu bilir ve gereksiz null uyarılarını bastırır.

using System.Diagnostics.CodeAnalysis;

[DoesNotReturn]
public static void ThrowNotFound(int id)
    => throw new KeyNotFoundException($"Entity {id} not found");

// Usage — no null warning after the call:
var order = _db.Orders.Find(id);
if (order is null) ThrowNotFound(id);

Console.WriteLine(order.Id); // no CS8602 — compiler knows ThrowNotFound threw

MemberNotNull: Alanlar İçin Son Koşul

[MemberNotNull], bir yöntemin döndükten sonra belirli alanların null olmadığını garanti ettiğini derleyiciye bildirir. Tembel başlatma yardımcıları için kullanışlıdır.

public class DataLoader
{
    private string? _data;

    [MemberNotNull(nameof(_data))]
    private void EnsureLoaded()
    {
        if (_data is null)
            _data = LoadFromFile();
    }

    public string GetData()
    {
        EnsureLoaded();
        return _data; // no CS8603 — compiler knows _data is set
    }
}

Öznitelikleri Birleştirme

Kesin API sözleşmeleri oluşturmak için öznitelikler birleştirilebilir. Burada birkaç özniteliği bir arada kullanan akıcı bir Guard yardımcısı gösterilmektedir.

public static class Guard
{
    [return: NotNull]
    public static T NotNull<T>(
        [NotNull][AllowNull] T? value,
        [CallerArgumentExpression(nameof(value))] string? name = null)
        where T : class
    {
        ArgumentNullException.ThrowIfNull(value, name);
        return value;
    }
}

// Usage:
var product = Guard.NotNull(await _repo.FindAsync(id));
Console.WriteLine(product.Name); // no warning

Null İşleçleri: ?. ?? ??=

Null koşullu (?.), null birleştirme (??) ve null birleştirme ataması (??=) işleçleri, uzun if denetimleri yazmadan kısa ve null güvenli kod yazmanızı sağlar.

string? name = GetName();

// ?. safe navigation
int? len = name?.Length;
string? upper = name?.ToUpper().Trim();

// ?? default value
string display = name ?? "Anonymous";

// ??= lazy init
name ??= "Default";

// Chaining
string result = user?.Profile?.DisplayName ?? user?.Name ?? "Guest";

Hızlı Kontrol

Bir out parametresinin üzerindeki [NotNullWhen(true)] özniteliği derleyiciye ne bildirir?

Özet: Null Olabilirlik Öznitelikleri

Temel çıkarımlar:

  • [NotNullWhen(true)]: TryParse kalıbı — true dönüşünde null değildir
  • [MaybeNull]: null kabul etmeyen tür yine de null döndürebilir (genel varsayılanlar)
  • [DoesNotReturn]: yöntem her zaman özel durum fırlatır; sonraki kod erişilemezdir
  • [MemberNotNull]: yöntem döndüğünde alanların ayarlanmış olacağını garanti eder
  • ?., ??, ??=: kısa ve null güvenli gezinme ile varsayılan değerler

Sıkça Sorulan Sorular

“Ek Açıklamalar: ?, !, MaybeNull ve NotNull” dersi ücretsiz mi?

Evet — “Ek Açıklamalar: ?, !, MaybeNull ve NotNull” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“Ek Açıklamalar: ?, !, MaybeNull ve NotNull” dersinde ne öğreneceğim?

Nullable türler için ? işaretini, null'ı yok saymak için ! işaretini, kesin akış analizi için MaybeNull ve NotNullWhen gibi öznitelikleri kullanın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Ek Açıklamalar: ?, !, MaybeNull ve NotNull” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. NRT'yi Etkinleştirme ve Anlama
  2. Ek Açıklamalar: ?, !, MaybeNull ve NotNull
  3. Null Koşullu ve Null Birleştirme Operatörleri
  4. Bir Kod Tabanını NRT'ye Geçirme
← C# Academy Sayfasına Dön