Nullable değer türleri (C# Başvurusu)

Null yapılabilir bir değer türü , temel alınan değer türünün 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 yapılabilir bir değer türü olamaz.

Not

C# 8,0, Nullable başvuru türleri özelliğini tanıtır. Daha fazla bilgi için bkz. Nullable başvuru türleri. Nullable değer türleri C# 2 ' den başlayarak kullanılabilir.

Herhangi bir null yapılabilir değer türü, genel System.Nullable<T> yapının bir örneğidir. Aşağıdaki her türlü değiştirilebilir formdan bir temel alınan tür T ile null yapılabilir bir değer türüne başvurabilirsiniz: Nullable<T> veya T? .

Genellikle, temel alınan bir değer türünün tanımsız değerini temsil etmeniz gerektiğinde null yapılabilen bir değer türü kullanırsınız. Örneğin, bir Boolean veya bool değişken yalnızca ya false da true olabilir. Ancak bazı uygulamalarda bir değişken değeri tanımsız veya eksik olabilir. Örneğin, bir veritabanı alanı veya false içerebilir true veya hiçbir değer içeremez, yani, NULL . Bu senaryodaki türü kullanabilirsiniz bool? .

Bildirim ve atama

Değer türü, karşılık gelen null yapılabilir değer türüne örtük olarak dönüştürülebilir olduğundan, onun temel alınan değer türü için yaptığınız gibi, null olabilen değer türünde bir değişkene bir değer atayabilirsiniz. Ayrıca değeri de atayabilirsiniz null . Ö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 olabilen bir değer türünün varsayılan değeri temsil eder null , diğer bir deyişle, özelliği işlevinin döndürdüğü false bir örneğidir Nullable<T>.HasValue .

Null yapılabilir bir değer türünün örneğinin incelenmesi

C# 7,0 ' den başlayarak işleci bir tür düzeniyle birlikte kullanarak , için null null olabilen değer türünün bir örneğini inceleyebilir ve temel alınan bir türün değerini 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

Her zaman, null olabilen bir değer türü değişkeninin değerini incelemek ve almak için aşağıdaki salt okunurdur özelliklerini kullanabilirsiniz:

Aşağıdaki örnek, değişkenin görüntülemeden önce bir değer içerip içermediğini test etmek için özelliğini kullanır HasValue :

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 gösterildiği gibi, null atanabilir bir değer türünün değişkenini özelliğini kullanmak HasValue yerine ile null 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 yapılabilir bir değer türünden temel alınan bir türe dönüştürme

Null olabilen bir değer türünün değerini null yapılamayan bir değer türü değişkenine atamak istiyorsanız, yerine atanacak null değeri belirtmeniz gerekebilir. Bunu yapmak için null birleşim işlecini kullanın (aynı amaçla yöntemini de 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 alınan değer türünün varsayılan değerini kullanmak istiyorsanız yöntemini kullanın Nullable<T>.GetValueOrDefault() .

Ayrıca, aşağıdaki örnekte gösterildiği gibi, null olabilen bir değer türünü null yapılamayan bir türe açıkça çevirebilirsiniz:

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 yapılabilir bir değer türünün değeri ise null , açık atama bir InvalidOperationException oluşturur.

Null yapılamayan bir değer türü T , karşılık gelen null yapılabilir değer türüne T? örtük olarak dönüştürülebilir.

Yükseltilmemiş işleçleri

Önceden tanımlanmış birli ve ikili işleçler ya da bir değer türü tarafından desteklenen aşırı yüklenmiş işleçler, karşılık gelen Nullable değer türü T? tarafından da desteklenir. Yükseltilmemiş işleçleriolarak da bilinen bu işleçler, bir veya her iki işlenen null ise üretir ; Aksi takdirde işleç, sonucu hesaplamak için işlenenlerinin kapsanan değerlerini 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

bool?Türü için, önceden tanımlanmış & ve | işleçleri bu bölümde açıklanan kurallara uymalıdır: işleçlerden biri null olsa bile bir operatör değerlendirmesinin sonucu null olmamalıdır. Daha fazla bilgi için, Boole mantıksal işleçler makalesinin Nullable Boolean mantıksal işleçler bölümüne bakın.

Karşılaştırma işleçleri><= ,, ve >= bir veya her iki işlenen null ise sonuç olur false ; Aksi takdirde, kapsanan işlenen değerleri karşılaştırılır. Belirli bir karşılaştırma (örneğin, <= ) döndürdüğünden false , zıt karşılaştırma ( > ) işlevinin döndürdüğü true varsayılmayın. Aşağıdaki örnek, 10 ' un olduğunu gösterir

  • Ne büyük ne de eşittir null
  • ya da 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 nullnulltruefalse de, sonuç ise, sonuç olur; aksi takdirde, kapsanan işlenen değerleri karşılaştırılır.

Eşitsizlik işleci için, her iki işlenen null de ise sonuç falsenulltrue olur; aksi takdirde, işlenen, işlenen 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 kutudan çıkarma

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

  • HasValueDönerse false , null başvuru üretilir.
  • HasValuetrue Döndürülürse, temel alınan değer türünün T karşılık gelen değeri kutulanır, örneği Nullable<T> değildir.

Aşağıdaki örnekte gösterildiği gibi, bir değer türünün T paketlenmiş değerini karşılık gelen null yapılabilir değer türüne T? bırakabilirsiniz:

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

Null yapılabilir değer türünü belirleme

Aşağıdaki örnek, bir System.Type Örneğin oluşturulmuş bir null yapılabilir değer türünü, diğer bir deyişle System.Nullable<T> belirtilen tür parametresine T sahip türü temsil edip etmediğini nasıl belirleyeceğini 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 gösterildiği gibi, bir örnek oluşturmak için typeof işlecini kullanırsınız.

Bir örneğin, null olabilen bir değer türünde olup olmadığını anlamak istiyorsanız, önceki kodla test edilecek bir Type örnek almak için yöntemini kullanmayın Object.GetType . Yöntemini null yapılabilir bir değer türünün bir örneğinde çağırdığınızda Object.GetTypeObject.GetTypeObject ayarlanır. Null olabilen bir değer türünün null olmayan bir örneğinin kutulenmesi, temel alınan türün bir değer kutulamasında eşdeğerdir, GetType null olabilen bir değer türünün temel türünü temsil eden bir Type ö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 yapılabilir değer türünde olup olmadığını anlamak için , işleç kullanmayın. Aşağıdaki örnekte gösterildiği gibi, null olabilen bir değer türü örneği ve temel alınan tür örneğini işleçle 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, Nullable.GetUnderlyingType bir örneğin Nullable değer türünde olup olmadığını denetlemek için ilk örnekten ve Nullable.GetUnderlyingType işlecinden öğesini kullanın.

Not

Bu bölümde açıklanan yöntemler, null yapılabilir başvuru türleridurumunda geçerli değildir.

C# dili belirtimi

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

Ayrıca bkz.