Null değer türleri (C# başvurusu)
Null atanabilir değer türüT?
, temel değer türünün T
tüm değerlerini ve ek bir null değeri temsil eder. Örneğin, aşağıdaki üç değerden herhangi birini bir bool?
değişkene atayabilirsiniz: true
, false
veya null
. Temel alınan değer türü T
null atanabilir bir değer türü olamaz.
Herhangi bir null atanabilir değer türü, genel System.Nullable<T> yapının bir örneğidir. Aşağıdaki değiştirilebilir formlardan herhangi birinde temel alınan bir türe sahip null atanabilir bir değer türüne T
başvurabilirsiniz: Nullable<T>
veya T?
.
Temel alınan değer türünün tanımsız değerini temsil etmeniz gerektiğinde genellikle null atanabilir bir değer türü kullanırsınız. Örneğin, boole veya bool
değişkeni yalnızca veya false
olabilirtrue
. Ancak bazı uygulamalarda bir değişken değeri tanımsız veya eksik olabilir. Örneğin, bir veritabanı alanı true
veya false
içerebilir veya hiç değer içermeyebilir, yani . NULL
Bu senaryoda türünü kullanabilirsiniz bool?
.
Bildirim ve atama
Değer türü, karşılık gelen null atanabilir değer türüne örtük olarak dönüştürülebilir olduğundan, temel değer türü için bunu yaptığınız gibi, null atanabilir değer türündeki bir değişkene değer atayabilirsiniz. Değeri de atayabilirsiniz null
. Örneğin:
double? pi = 3.14;
char? letter = 'a';
int m2 = 10;
int? m = m2;
bool? flag = null;
// An array of a nullable value type:
int?[] arr = new int?[10];
Null atanabilir değer türünün varsayılan değeri değerini temsil eder null
; yani özelliği döndüren Nullable<T>.HasValue false
bir örnektir.
Null atanabilir bir değer türünün örneğinin incelenmesi
hem null atanabilir bir değer türünün örneğini incelemek hem de temel alınan türdeki bir değeri almak için işlecini tür deseniyle kullanabilirsinizis
:null
int? a = 42;
if (a is int valueOfA)
{
Console.WriteLine($"a is {valueOfA}");
}
else
{
Console.WriteLine("a does not have a value");
}
// Output:
// a is 42
Null atanabilir değer türü değişkenini incelemek ve almak için her zaman aşağıdaki salt okunur özellikleri kullanabilirsiniz:
Nullable<T>.HasValue , null atanabilir bir değer türünün örneğinin temel türünde bir değere sahip olup olmadığını gösterir.
Nullable<T>.Value ise HasValue
true
, temel alınan türün değerini alır. ise HasValuefalse
özelliği Value bir InvalidOperationExceptionoluşturur.
Aşağıdaki örnek, değişkeni görüntülemeden HasValue
önce değişkenin bir değer içerip içermediğini test etmek için özelliğini kullanır:
int? b = 10;
if (b.HasValue)
{
Console.WriteLine($"b is {b.Value}");
}
else
{
Console.WriteLine("b does not have a value");
}
// Output:
// b is 10
Aşağıdaki örnekte gösterildiği gibi, null atanabilir bir değer türünün değişkenini HasValue
özelliğini kullanmak yerine ile null
de karşılaştırabilirsiniz:
int? c = 7;
if (c != null)
{
Console.WriteLine($"c is {c.Value}");
}
else
{
Console.WriteLine("c does not have a value");
}
// Output:
// c is 7
Null değer türünden temel alınan türe dönüştürme
Null atanabilir değer türünde bir değeri null atanamaz değer türü değişkenine atamak istiyorsanız, yerine null
atanacak değeri belirtmeniz gerekebilir. Bunu yapmak için null birleşim işlecini ??
kullanın (yöntemini aynı amaç için de kullanabilirsinizNullable<T>.GetValueOrDefault(T)):
int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}"); // output: b is 28
int? c = null;
int d = c ?? -1;
Console.WriteLine($"d is {d}"); // output: d is -1
yerine null
temel değer türünün varsayılan değerini kullanmak istiyorsanız yöntemini kullanınNullable<T>.GetValueOrDefault().
Aşağıdaki örnekte gösterildiği gibi, null atanabilir bir değer türünü null atanamaz bir türe açıkça da dönüştürebilirsiniz:
int? n = null;
//int m1 = n; // Doesn't compile
int n2 = (int)n; // Compiles, but throws an exception if n is null
Çalışma zamanında, null atanabilir bir değer türünün değeri ise null
, açık atama bir InvalidOperationExceptionoluşturur.
Null değer atanamayan bir değer türü T
, karşılık gelen null atanabilir değer türüne T?
örtük olarak dönüştürülebilir.
Kaldırılan işleçler
Önceden tanımlanmış birli ve ikili işleçler veya bir değer türü T
tarafından desteklenen aşırı yüklenmiş işleçler, karşılık gelen null atanabilir değer türü T?
tarafından da desteklenir. Kaldırılan işleçler olarak da bilinen bu işleçlernull
, işlenenlerden biri veya her ikisiyse üretirnull
; aksi takdirde, işleç sonucu hesaplamak için işlenenlerinin içerdiği değerleri kullanır. Örneğin:
int? a = 10;
int? b = null;
int? c = 10;
a++; // a is 11
a = a * c; // a is 110
a = a + b; // a is null
Not
Türü için bool?
, önceden tanımlanmış &
ve |
işleçler bu bölümde açıklanan kurallara uymaz: işlenenlerden biri olsa bile işleç değerlendirmesinin null
sonucu null olmayabilir. Daha fazla bilgi için Boole mantıksal işleçleri makalesinin Null Atanabilir Boole mantıksal işleçleri bölümüne bakın.
Karşılaştırma işleçleri için , >
, <=
ve >=
, işleçlerinden null
<
biri veya her ikisi de ise, sonuç şudurfalse
; aksi takdirde işlenenlerin kapsanan değerleri karşılaştırılır. Belirli bir karşılaştırma (örneğin, <=
) döndürdüğü false
için ters karşılaştırmanın (>
) döndürdüğünü true
varsaymayın. Aşağıdaki örnekte 10 değerinin
- büyüktür veya eşit değildir
null
- veya küçüktür
null
int? a = 10;
Console.WriteLine($"{a} >= null is {a >= null}");
Console.WriteLine($"{a} < null is {a < null}");
Console.WriteLine($"{a} == null is {a == null}");
// Output:
// 10 >= null is False
// 10 < null is False
// 10 == null is False
int? b = null;
int? c = null;
Console.WriteLine($"null >= null is {b >= c}");
Console.WriteLine($"null == null is {b == c}");
// Output:
// null >= null is False
// null == null is True
Eşitlik işleci ==
için, her iki işlenen null
de ise, sonuç true
, işlenenlerden null
yalnızca biri ise sonuç olurfalse
; aksi takdirde, işlenenlerin kapsanan değerleri karşılaştırılır.
Eşitsizlik işleci !=
için, her iki işlenen null
de ise, sonuç false
, işlenenlerden null
yalnızca biri ise, sonuç olurtrue
; aksi takdirde işlenenlerin kapsanan değerleri karşılaştırılır.
İki değer türü arasında kullanıcı tanımlı bir dönüştürme varsa, aynı dönüştürme karşılık gelen null atanabilir değer türleri arasında da kullanılabilir.
Kutulama ve kutu açma
Null atanabilir değer türünün T?
bir örneği aşağıdaki gibi kutulanır :
- döndürürse HasValue
false
, null başvuru oluşturulur. - döndürürse HasValue
true
, temel değer türününT
karşılık gelen değeri kutulanır, örneğini Nullable<T>değil.
Aşağıdaki örnekte gösterildiği gibi, bir değer türünün T
kutulanmış değerini karşılık gelen null atanabilir değer türüne T?
kaldırabilirsiniz:
int a = 41;
object aBoxed = a;
int? aNullable = (int?)aBoxed;
Console.WriteLine($"Value of aNullable: {aNullable}");
object aNullableBoxed = aNullable;
if (aNullableBoxed is int valueOfA)
{
Console.WriteLine($"aNullableBoxed is boxed int: {valueOfA}");
}
// Output:
// Value of aNullable: 41
// aNullableBoxed is boxed int: 41
Boş değer atanabilir değer türünü tanımlama
Aşağıdaki örnekte, örneğin System.Type oluşturulan bir null atanabilir değer türünü, yani belirtilen tür parametresine System.Nullable<T> T
sahip türü temsil edip etmediğinin nasıl belirleneceği gösterilmektedir:
Console.WriteLine($"int? is {(IsNullable(typeof(int?)) ? "nullable" : "non nullable")} value type");
Console.WriteLine($"int is {(IsNullable(typeof(int)) ? "nullable" : "non-nullable")} value type");
bool IsNullable(Type type) => Nullable.GetUnderlyingType(type) != null;
// Output:
// int? is nullable value type
// int is non-nullable value type
Örnekte gösterildiği gibi, bir System.Type örnek oluşturmak için typeof işlecini kullanırsınız.
Örneğin null atanabilir bir değer türünde olup olmadığını belirlemek istiyorsanız, önceki kodla test edilecek örneği Type almak için yöntemini kullanmayınObject.GetType. Null atanabilir bir değer türünün örneğinde yöntemini çağırdığınızdaObject.GetType, örneği olarak Objectkutulanır. Null değer türünün null olmayan bir örneğinin kutulanması, temel alınan türdeki bir değerin kutulanmasıyla eşdeğer olduğundan, GetType null atanabilir değer türünün temel türünü temsil eden bir örnek döndürür Type :
int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32
Ayrıca, bir örneğin null atanabilir bir değer türünde olup olmadığını belirlemek için is işlecini kullanmayın. Aşağıdaki örnekte gösterildiği gibi, null atanabilir bir değer türü örneğinin türlerini ve temel alınan tür örneğini işleciyle is
ayırt edemezsiniz:
int? a = 14;
if (a is int)
{
Console.WriteLine("int? instance is compatible with int");
}
int b = 17;
if (b is int?)
{
Console.WriteLine("int instance is compatible with int?");
}
// Output:
// int? instance is compatible with int
// int instance is compatible with int?
Bunun yerine, örneğin null atanabilir bir değer türünde olup olmadığını denetlemek için ilk örnekteki ve typeof işlecini kullanınNullable.GetUnderlyingType.
Not
Bu bölümde açıklanan yöntemler, null atanabilir başvuru türleri söz konusu olduğunda geçerli değildir.
C# dili belirtimi
Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:
- Boş değer atanabilir türler
- Kaldırılan işleçler
- Örtük null atanabilir dönüştürmeler
- Açık null atanabilir dönüştürmeler
- Kaldırılan dönüştürme işleçleri