Aracılığıyla paylaş


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.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tavsiye

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

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?.

Genellikle, temel alınan değer türünün tanımsız değerini temsil etmeniz gerektiğinde null atanabilir bir değer türü kullanın. Örneğin, boole veya booldeğişkeni yalnızca veya trueolabilirfalse. Ancak bazı uygulamalarda bir değişken değeri tanımsız veya eksik olabilir. Örneğin, bir veritabanı alanı veya falseiçerebilir true veya hiç değer içermeyebilir, yani . NULL Bu senaryoda türünü kullanabilirsiniz bool? .

Bildirim ve atama

Bir 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 değer türünün varsayılan değeri değerini temsil eder null. Özelliği döndüren Nullable<T>.HasValuefalsebir örnektir.

Null atanabilir bir değer türünün örneğinin incelenmesi

için null atanabilir bir değer türünün örneğini denetlemek ve temel alınan türde bir değer almak için nullişlecini tür deseniyleis kullanın:

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şkeninin değerini denetlemek 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 denetlemek 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 null özelliğini kullanmak yerine ile HasValue 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çla da kullanabilirsiniz Nullable<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 temel değer türünün varsayılannullistiyorsanı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

Null atanabilir değer türü T? , önceden tanımlanmış birli ve ikili işleçleri veya bir değer türünün T desteklediği aşırı yüklenmiş işleçleri destekler. Kaldırılan işleçler olarak da bilinen bu işleçler, işlenenlerden biri veya her ikisi nullise döndürürnull. Aksi takdirde, işleç sonucu hesaplamak için işlenenlerinin kapsanan değerlerini 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 <nullbiri 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 sonucu olurtrue. İşlenenlerden yalnızca biri ise null, sonuç olur false. 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ç olurfalse. İşlenenlerden yalnızca biri ise null, sonuç olur true. 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, karşılık gelen null atanabilir değer türleri arasında da aynı dönüştürme kullanılabilir.

Kutulama ve kutu açma

Null değer türünün T?bir örneğini kutuladığınızda aşağıdaki kurallar geçerlidir:

  • döndürürse HasValuefalse, kutulama işlemi null başvuruyu döndürür.
  • döndürürse HasValuetrue, kutulama işlemi, örneğini değil, temel değer türünün Tkarşılık gelen değerini kutular Nullable<T>.

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 örnek oluşturmak için typeofSystem.Type.

Örneğin null atanabilir bir değer türünde olup olmadığını belirlemek istiyorsanız, yukarıdaki kodu kullanarak test etmek üzere bir Type örneği 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 . Null değer türünün null olmayan bir örneğini kutulama, temel alınan türdeki bir değeri kutulamayla eşdeğer olduğundan, GetType null 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, işlecini kullanarak null atanabilir bir değer türü örneğinin ve temel alınan tür örneğinin is türlerini ayırt edebilirsiniz:

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 yöntemini ve typeof işlecini kullanınNullable.GetUnderlyingType.

Not

Bu bölümde açıklanan yöntemler null atanabilir başvuru türleri için 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.