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:
Nullable<T>.HasValue null yapılabilir bir değer türünün bir örneğinin temel alınan türünün bir değeri olup olmadığını gösterir.
Nullable<T>.Valueise,
true
temel alınan bir türün HasValue değerini alır. HasValueİsefalse
, Value özelliği bir InvalidOperationException oluşturur.
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 null
null
true
false
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ç false
null
true
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. - HasValue
true
Döndürülürse, temel alınan değer türününT
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:
- Null atanabilir türler
- Yükseltilmemiş işleçleri
- Örtük null yapılabilir dönüşümler
- Açık boş değer atanabilir dönüşümler
- Yükseltilmemiş dönüştürme işleçleri