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

Null değere sahip bir değer türü, T? temel alınan değer türünün tüm değerlerini ve ek bir null T değeri temsil eder. Örneğin, bir değişkene aşağıdaki üç değerden herhangi birini bool? attayebilirsiniz: true , false veya null . Temel alınan değer T türü, null değere değiştirilebilir bir değer türü olamaz.

Not

C# 8.0, null değere değiştirilebilir başvuru türleri özelliğini tanıtıyor. Daha fazla bilgi için bkz. Boş değere değiştirilebilir başvuru türleri. Null değere sahip değer türleri C# 2'den itibaren kullanılabilir.

Herhangi bir null değer türü, genel yapının bir System.Nullable<T> örneğidir. Aşağıdaki değiştirilebilir formlardan herhangi birsinde temel alınan bir türe sahip null T değere sahip bir değer türüne başvurabilir: Nullable<T> veya T? .

Temel alınan bir değer türünün tanımlanmamış değerini temsil etmek için genellikle null değere değiştirilebilir bir değer türü kullanırsiniz. Örneğin, bir Boole veya bool , değişkeni yalnızca veya true false olabilir. Ancak bazı uygulamalarda değişken değeri tanımlanmamış veya eksik olabilir. Örneğin, bir veritabanı alanı veya içerebilir veya değer içermeyebilirsiniz, yani true false NULL . Bu senaryoda bool? türünü kullanabilirsiniz.

Bildirim ve atama

Bir değer türü, karşılık gelen null atanabilir değer türüne örtülü olarak dönüştürülebilir olduğundan, null atanabilir değer türünde bir değişkene, temel alınan değer türü için bunu yapmak istediğiniz şekilde bir değer atılabilir. Değeri de at null attırma. Örnek:

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ğere sahip bir değer türünün varsayılan değeri değerini temsil eder, yani özelliği null döndüren Nullable<T>.HasValue bir false örnektir.

Null değere sahip bir değer türünün örneğini inceleme

C# 7.0'dan itibaren işleci bir tür deseniyle birlikte kullanarak hem için null değere sahip bir değer türünün örneğini inceler hem de temel alınan bir türün is değerini null alabilirsiniz:

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 değere sahip bir değer türü değişkeninin değerini incelemek ve almak için her zaman aşağıdaki salt okunur özellikleri kullanabilirsiniz:

Aşağıdaki örnek, değişkenini HasValue görüntülemeden önce bir değer içerdiğ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

Ayrıca, aşağıdaki örnekte de olduğu gibi, özelliğini kullanmak yerine ile null null HasValue değere sahip bir değer türünde bir değişkeni 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ğere sahip bir değer türünden temel alınan türe dönüştürme

Null atanabilir olmayan bir değer türü değişkenine null atanabilir bir değer türü değeri atamak için yerine atanacak değeri belirtmeniz null gerekir. Bunu yapmak için null-coalescing ?? işleci kullanın (yöntemini aynı amaç için de Nullable<T>.GetValueOrDefault(T) kullanabilirsiniz):

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 alınan değer türünün varsayılan değerini kullanmak için null yöntemini Nullable<T>.GetValueOrDefault() kullanın.

Ayrıca, aşağıdaki örnekte de olduğu gibi null değer atılabilir bir değer türünü null değere sahip olmayan bir türe açıkça atılabilirsiniz:

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 değer atılabilir bir değer türünün değeri null ise, açık tür atma bir InvalidOperationException atar.

Null değere çevrilebilir olmayan bir değer türü, karşılık gelen null T değer türüne örtülü olarak dönüştürülebilir. T?

Kaldıran işleçler

Önceden tanımlanmış birli ve ikili işleçler veya bir değer türü tarafından desteklenen aşırı yüklenmiş işleçler de karşılık gelen null değer türü T tarafından de de T? desteklenebilir. Kaldırilen işleçler olarak da bilinen bu işleçler, işlenenlerden biri veya her ikisi de ise üretir; aksi takdirde işleç, sonucu hesaplamak için işlenenlerinin içerdiği null null değerleri kullanır. Örnek:

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, önceden tanımlanmış ve işleçler bu bölümde açıklanan kurallara uymaz: işlenenlerden biri olsa bile bir işleç bool? & | değerlendirmesinin sonucu null null olamaz. Daha fazla bilgi için Boole mantıksal işleçleri makalesinde Null Değer Değere Sahip 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 biri veya her ikisi de ise sonuç olur; aksi takdirde işlenenlerin içerdiği < > değerler <= >= null false karşılaştırıldı. Belirli bir karşılaştırma (örneğin, ) döndür olduğundan, ters karşılaştırmanın ( ) döndür <= false olduğunu > true varsayın. Aşağıdaki örnekte 10'ların

  • ne büyüktür ne de eşittir null
  • veya küçük 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 de ise, sonuç olur. İşleçlerden yalnızca biri ise sonuç olur; aksi takdirde işlenenlerin içerdiği değerler == null true karşılaştırılarak elde edilen null false değerdir.

Eşitsizlik işleci için, her iki işlenen de ise, sonuç ise, işlenenlerden yalnızca biri ise , sonuç olur; aksi takdirde işlenenlerin içerdiği değerler != null false null true karşılaştırıldı.

İki değer türü arasında kullanıcı tanımlı bir dönüştürme varsa, karşılık gelen null değer türleri arasında aynı dönüştürme de kullanılabilir.

Kutulama ve kutudan açma

Null değere sahip bir değer türünün T? örneği aşağıdaki gibi kutulanmıştır:

  • HasValue false döndürürse, null başvuru üretir.
  • HasValuedöndürürse, temel alınan değer türünün karşılık gelen değeri örneği true değil kutu T Nullable<T> içindedir.

Aşağıdaki örnekte de olduğu gibi, bir değer türünün kutulanmamış değerini karşılık gelen T null değer T? türünden kutusundan değiştirilebilir:

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 değere sahip bir değer türünü tanımlama

Aşağıdaki örnek, örneğin, belirtilen tür parametresine sahip türü olan, oluşturulmuş null değere sahip bir değer türünü temsil edip ettiğini System.Type System.Nullable<T> belirlemeyi T gösterir:

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 de olduğu gibi, bir örnek oluşturmak için typeof işleci System.Type kullanırsiniz.

Bir örneğin null değer türünde olup olmadığını belirlemek için, yukarıdaki kodla test edilecek bir örneği almak Object.GetType Type için yöntemini kullanmayın. Null değere Object.GetType sahip bir değer türünün örneğinde yöntemini çağırarak örneği olarak kutular. Object Null değere sahip bir değer türünün null olmayan bir örneğinin kutulaması, temel alınan türün bir değerinin kutulama ile eşdeğer olduğu için, null değerlenebilir bir değer türünün temel türünü temsil eden GetType Type bir örnek döndürür:

int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32

Ayrıca, bir örneğin null değer türünde olup olmadığını belirlemek için is işleci kullanmayın. Aşağıdaki örnekte de olduğu gibi, null değere sahip bir değer türü örneğinin ve temel alınan tür örneğinin türlerini işleciyle ayırt etmek mümkün is değildir:

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?

Bir örneğin null değer türünde olup olmadığını belirlemek için aşağıdaki örnekte sunulan kodu kullanabilirsiniz:

int? a = 14;
Console.WriteLine(IsOfNullableType(a));  // output: True

int b = 17;
Console.WriteLine(IsOfNullableType(b));  // output: False

bool IsOfNullableType<T>(T o)
{
    var type = typeof(T);
    return Nullable.GetUnderlyingType(type) != null;
}

Not

Bu bölümde açıklanan yöntemler, null değere sahip başvuru türleri için geçerli değildir.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtimlerinin aşağıdaki bölümlerine bakın:

Ayrıca bkz.