Null değer türleri (C# başvurusu)

Null atanabilir değer türüT?, temel değer türününT 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, falseveya 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 booldeğişkeni yalnızca veya falseolabilirtrue. Ancak bazı uygulamalarda bir değişken değeri tanımsız veya eksik olabilir. Örneğin, bir veritabanı alanı true veya falseiç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>.HasValuefalsebir ö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:

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 nullatanacak 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 nulltemel 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 nullsonucu 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ç olurfalse; aksi takdirde işlenenlerin kapsanan değerleri karşılaştırılır. Belirli bir karşılaştırma (örneğin, <=) döndürdüğü falseiçin ters karşılaştırmanın (>) döndürdüğünü truevarsaymayı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 nullde ise, sonuç true, işlenenlerden nullyalnı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 nullde ise, sonuç false, işlenenlerden nullyalnı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 HasValuefalse, null başvuru oluşturulur.
  • döndürürse HasValuetrue, temel değer türünün T 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>Tsahip 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:

Ayrıca bkz.