Skip to content

Nullable Types

Genel Bakış

Nullable Types (Null Olabilen Tipler), C#'ta değer tiplerinin (value types) null değer alabilmesini sağlayan bir özelliktir. Bu özellik sayesinde, değer tipleri için null durumunu temsil edebilir ve bu durumu kontrol edebiliriz.

Nullable Types Tanımlama

  1. Nullable Sözdizimi

    Nullable<int> nullableInt = null;
    Nullable<double> nullableDouble = 3.14;
    

  2. ? Operatörü ile Kısa Sözdizimi

    int? nullableInt = null;
    double? nullableDouble = 3.14;
    

Nullable Types Özellikleri

  1. HasValue

    int? number = 42;
    if (number.HasValue)
    {
        Console.WriteLine($"Değer: {number.Value}");
    }
    else
    {
        Console.WriteLine("Değer null");
    }
    

  2. Value

    int? number = 42;
    int actualNumber = number.Value; // 42
    
    int? nullNumber = null;
    // nullNumber.Value kullanımı InvalidOperationException fırlatır
    

  3. GetValueOrDefault

    int? number = null;
    int result = number.GetValueOrDefault(); // 0
    int resultWithDefault = number.GetValueOrDefault(42); // 42
    

Nullable Types Operatörleri

  1. Null-Coalescing Operatörü (??)

    int? number = null;
    int result = number ?? 42; // 42
    

  2. Null-Conditional Operatörü (?.)

    Person? person = null;
    string? name = person?.Name; // null
    
    // Zincirleme kullanım
    string? city = person?.Address?.City;
    

  3. Null-Forgiving Operatörü (!)

    int? number = null;
    // Derleyiciye null olmadığını garanti ediyoruz
    int result = number!.Value;
    

Nullable Types Dönüşümleri

  1. Implicit Conversion

    int regularInt = 42;
    int? nullableInt = regularInt; // Otomatik dönüşüm
    

  2. Explicit Conversion

    int? nullableInt = 42;
    int regularInt = (int)nullableInt; // Explicit dönüşüm
    
    int? nullValue = null;
    // (int)nullValue kullanımı InvalidOperationException fırlatır
    

Nullable Types ve LINQ

List<int?> numbers = new List<int?> { 1, null, 3, null, 5 };

// Null olmayan değerleri filtreleme
var nonNullNumbers = numbers.Where(n => n.HasValue);

// Null değerleri varsayılan değerle değiştirme
var defaultNumbers = numbers.Select(n => n ?? 0);

Nullable Types ve Pattern Matching

int? number = 42;

// Pattern matching ile kontrol
if (number is int value)
{
    Console.WriteLine($"Değer: {value}");
}

// Switch expression ile kullanım
string result = number switch
{
    null => "Değer null",
    int value => $"Değer: {value}"
};

Nullable Types Best Practices

  1. Null Kontrolü

    // Kötü
    int? number = GetNumber();
    int result = number.Value; // Potansiyel exception
    
    // İyi
    int? number = GetNumber();
    if (number.HasValue)
    {
        int result = number.Value;
    }
    

  2. Default Değer Kullanımı

    // Kötü
    int? number = GetNumber();
    int result = number ?? 0;
    
    // İyi
    int? number = GetNumber();
    int result = number.GetValueOrDefault(0);
    

  3. Null-Conditional Operatörü

    // Kötü
    if (person != null && person.Address != null)
    {
        string city = person.Address.City;
    }
    
    // İyi
    string? city = person?.Address?.City;
    

Mülakat Soruları

  1. Nullable Types Temelleri
  2. Nullable Types nedir ve ne işe yarar?
  3. Nullable ve ? operatörü arasındaki fark nedir?
  4. Hangi tipler nullable olabilir?

  5. Nullable Types Özellikleri

  6. HasValue ve Value özellikleri ne işe yarar?
  7. GetValueOrDefault metodu nasıl kullanılır?
  8. Nullable Types'ın varsayılan değeri nedir?

  9. Nullable Types Operatörleri

  10. Null-Coalescing operatörü (??) nasıl çalışır?
  11. Null-Conditional operatörü (?.) nasıl kullanılır?
  12. Null-Forgiving operatörü (!) ne işe yarar?

  13. Nullable Types ve Tip Dönüşümleri

  14. Nullable Types'tan normal tipe dönüşüm nasıl yapılır?
  15. Dönüşümlerde dikkat edilmesi gerekenler nelerdir?
  16. Implicit ve explicit dönüşümler arasındaki farklar nelerdir?

  17. Nullable Types ve Exception Handling

  18. Nullable Types kullanırken hangi exception'lar oluşabilir?
  19. Bu exception'lar nasıl önlenebilir?
  20. Nullable Types ve try-catch blokları nasıl kullanılır?

  21. Nullable Types ve Performans

  22. Nullable Types'ın performans etkisi nedir?
  23. Boxing/unboxing durumları nasıl oluşur?
  24. Performans optimizasyonu nasıl yapılır?

  25. Nullable Types ve LINQ

  26. LINQ sorgularında Nullable Types nasıl kullanılır?
  27. Null değerler LINQ sorgularında nasıl işlenir?
  28. LINQ ve Nullable Types performans etkileşimi nasıldır?

  29. Nullable Types ve Pattern Matching

  30. Pattern matching ile Nullable Types nasıl kontrol edilir?
  31. Switch expression'larda Nullable Types nasıl kullanılır?
  32. Pattern matching performans etkisi nedir?

  33. Nullable Types Best Practices

  34. Nullable Types kullanırken dikkat edilmesi gerekenler nelerdir?
  35. Kod okunabilirliği nasıl sağlanır?
  36. Test edilebilirlik nasıl artırılır?

  37. Nullable Types ve Modern C#

    • C# 8.0 ve sonrasında Nullable Types nasıl gelişti?
    • Nullable reference types ile ilişkisi nedir?
    • Modern C# özellikleri Nullable Types'ı nasıl etkiler?

Örnek Kod Soruları

  1. Nullable Int Toplama

    public static int? AddNullableInts(int? a, int? b)
    {
        // Implementasyon
    }
    

  2. Nullable String Kontrolü

    public static bool IsNullOrEmpty(string? text)
    {
        // Implementasyon
    }
    

  3. Nullable Object Dönüşümü

    public static T? ConvertToNullable<T>(object value) where T : struct
    {
        // Implementasyon
    }
    

  4. Nullable List Filtreleme

    public static IEnumerable<T> FilterNulls<T>(IEnumerable<T?> source)
    {
        // Implementasyon
    }
    

  5. Nullable Dictionary İşlemleri

    public static TValue? GetValueOrDefault<TKey, TValue>(
        IDictionary<TKey, TValue> dictionary,
        TKey key)
    {
        // Implementasyon
    }
    

Kaynaklar