![]()
Normalde .Net ortamında değer yüklü tipler null değer taşımazlar. Null değeri taşıyan bir nesne “Heap” te varlığını göstermez ve değeri olan tipler de “stack” te tutulduğu için null değer taşımazlar. Detay için bu makale okunabilir
Şimdi veritabanından çektiğimiz bir veri null da gelebilir bu durumda kod tarfında null olarak bunu karşılayamazsak ve yönetemezsek sorunlar yaşayacağız. Bunun için C# 2.0 versiyonu ile gelen generic mimari yapı bu sorunu çözmektedir. Bu mimaride Nullable<T> generic bir struct(yapı) olarak tanımlanmıştır. Artık değer yüklü tipler null taşıyabiliyor. Kütüphanesini inceleyebilirisiniz;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
public struct Nullable<T> where T : struct { private bool hasValue; internal T value; public bool HasValue { get { return hasValue; } } public T Value { get { if (!hasValue) { ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue); } return value; } } public Nullable(T value) { this.value = value; hasValue = true; } public T GetValueOrDefault() { return value; } public T GetValueOrDefault(T defaultValue) { if (!hasValue) { return defaultValue; } return value; } public override bool Equals(object other) { if (!hasValue) { return other == null; } if (other == null) { return false; } return value.Equals(other); } public override int GetHashCode() { if (!hasValue) { return 0; } return value.GetHashCode(); } public override string ToString() { if (!hasValue) { return “”; } return value.ToString(); } public static implicit operator T?(T value) { return value; } public static explicit operator T(T? value) { return value.Value; } } |
Önemli Not: Nullable tiplerde generic bir kısıtlama vardır. Sadece değer tiplere uygulanabilirler. Referans tiplerde kullanamayız yani Nullable<string> şeklinde bir tanımlama yapamayız.
Tanımlaması şu şekilde;
|
1 2 3 4 5 6 7 8 |
Nullable<T> name = null; //yada ? işareti kullanarak nullable olabileceğini gösterebiliriz. datatype? name = null; |
Örnek
|
1 2 3 4 5 6 7 8 9 |
int number = null; // normalde bu hata verir ama aşağıdaki gibi tanımlandığında hata kalkacaktır Nullable<int> number = null; //yada int? number = null; |
- HasValue değer varsa True yoksa False dönecektir.
- GetValueOrDefault metodu geriye T tipinden bir değer döndürür. Eğer değer varsa değeri döndürür, null ise T tipinin default değerini yani 0 döner.
- Value ise T tipinden bir değer döndürür. number1 de T tipi int olduğu için geriye int döner başka tip olsaydı onu dönecekti.
Örnek
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
int? number1 = 7; int? number2 = null; if (number1.HasValue) //değer varsa true döner, null ise false döner. { Console.WriteLine(“number1: HasValue={0}, Value={1}”, number1.HasValue, number1.Value); } if (!number2.HasValue) //null olduğun için false döner. { Console.WriteLine(“number2: HasValue={0}, Value={1}”, number2.HasValue, number2.GetValueOrDefault()); } //Output: //number1: HasValue = True, Value = 7 //number2: HasValue = False, Value = 0 |
- Son olarak ta nullable olmayan bir tipe null değeri olan bir tip atamak istediğimiz de de ?? operatörü kullanırız.
- (Null Coalescing Operator) denen bu operatör uygulandığı değişkenin null olup olmadığını kontrol eder. Eğer null ise koşulda verilmiş değeri atar değilse değişkenin o andaki değerini döndürülür.
örnek
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
int? number1 = null; int number2 = number1 ?? 10; Console.WriteLine(number2); //Output: 10 //——————————— int? number1 = null; int defaultValue = number1 ?? default(int); // Output: 0 //———————————- int? number1 = 15; int number2 = number1 ?? 10; Console.WriteLine(number2); //Output: 15 //——————————— int? age = 30; int result = age ?? 18; // yaş null ise 18 ata //———————————- string message = null; string result = message ?? “no message”; Console.WriteLine(result); //Output: no message |
Sağlıcakla kalın…..








Bir yanıt yazın