Tür testi işleçleri ve atama ifadesi (C# başvurusu)
Tür denetimi veya tür dönüştürme gerçekleştirmek için aşağıdaki işleçleri ve ifadeleri kullanabilirsiniz:
- is işleci: bir ifadenin çalışma zamanı türünün belirli bir türle uyumlu olup olmadığını denetleyin
- as işleci: Çalışma zamanı türü bu türle uyumluysa bir ifadeyi açıkça belirli bir türe dönüştürün
- cast ifadesi: Açık dönüştürme gerçekleştirme
- typeof işleci: Türün System.Type örneğini alma
is işleci
işleci, is
bir ifade sonucunun çalışma zamanı türünün belirli bir türle uyumlu olup olmadığını denetler. C# 7.0 sürümünden is
itibaren işleç, bir ifade sonucunu bir desene göre de test ediyor.
Tür testi is
işlecine sahip ifade aşağıdaki forma sahiptir
E is T
burada E
, bir değer döndüren ve T
tür veya tür parametresinin adı olan bir ifadedir. E
anonim bir yöntem veya lambda ifadesi olamaz.
bir is
ifade sonucu null olmadığında ve aşağıdaki koşullardan herhangi biri doğru olduğunda işleç döndürür true
:
İfade sonucunun çalışma zamanı türü olur
T
.bir ifade sonucunun çalışma zamanı türü türünden
T
türetilir, arabiriminiT
uygular veya türündenT
öğesine başka bir örtük başvuru dönüştürmesi vardır.bir ifade sonucunun çalışma zamanı türü, temel alınan türe sahip null atanabilir bir değer türüdür
T
ve Nullable<T>.HasValue değeridirtrue
.İfade sonucunun çalışma zamanı türünden türüne
T
bir kutulama veya kutu açma dönüştürmesi vardır.
is
işleci kullanıcı tanımlı dönüştürmeleri dikkate almaz.
Aşağıdaki örnek, bir ifade sonucunun is
çalışma zamanı türü belirli bir türden türetilirse, yani türler arasında bir başvuru dönüştürmesi varsa işlecinin döndürdüğünü true
gösterir:
public class Base { }
public class Derived : Base { }
public static class IsOperatorExample
{
public static void Main()
{
object b = new Base();
Console.WriteLine(b is Base); // output: True
Console.WriteLine(b is Derived); // output: False
object d = new Derived();
Console.WriteLine(d is Base); // output: True
Console.WriteLine(d is Derived); // output: True
}
}
Sonraki örnekte, işlecin kutulama ve kutu açma dönüştürmelerini hesaba kattığını ancak sayısal dönüştürmeleri dikkate almadığını gösteriris
:
int i = 27;
Console.WriteLine(i is System.IFormattable); // output: True
object iBoxed = i;
Console.WriteLine(iBoxed is int); // output: True
Console.WriteLine(iBoxed is long); // output: False
C# dönüştürmeleri hakkında bilgi için C# dil belirtimininDönüştürmeler bölümüne bakın.
Desen eşleştirme ile tür testi
C# 7.0 sürümünden is
itibaren işleç, bir ifade sonucunu bir desene göre de test ediyor. Aşağıdaki örnekte, bir ifadenin çalışma zamanı türünü denetlemek için bildirim deseninin nasıl kullanılacağı gösterilmektedir:
int i = 23;
object iBoxed = i;
int? jNullable = 7;
if (iBoxed is int a && jNullable is int b)
{
Console.WriteLine(a + b); // output 30
}
Desteklenen desenler hakkında bilgi için bkz . Desenler.
as işleci
işleci, as
bir ifadenin sonucunu açıkça belirli bir başvuruya veya null atanabilir değer türüne dönüştürür. Dönüştürme mümkün değilse işleci as
döndürür null
. Tür değiştirme ifadesininas
aksine işleç hiçbir zaman özel durum oluşturmaz.
Formun ifadesi
E as T
burada E
bir değer döndüren ve T
bir tür veya tür parametresinin adı olan bir ifade, aynı sonucu verir
E is T ? (T)(E) : (T)null
ancak yalnızca E
bir kez değerlendirilir.
işleci as
yalnızca başvuru, null atanabilir, kutulama ve kutu açma dönüştürmelerini dikkate alır. kullanıcı tanımlı dönüştürme gerçekleştirmek için işlecini as
kullanamazsınız. Bunu yapmak için bir atama ifadesi kullanın.
Aşağıdaki örnekte işlecin kullanımı gösterilmektedir as
:
IEnumerable<int> numbers = new[] { 10, 20, 30 };
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]); // output: 40
}
Not
Yukarıdaki örnekte gösterildiği gibi, dönüştürmenin başarılı olup olmadığını denetlemek için ifadenin as
sonucunu ile null
karşılaştırmanız gerekir. C# 7.0 sürümünden başlayarak, dönüştürmenin başarılı olup olmadığını test etmek ve başarılı olursa sonucunu yeni bir değişkene atamak için is işlecini kullanabilirsiniz.
Atama ifadesi
Formun (T)E
atama ifadesi, ifadenin sonucunun E
türüne T
açık bir dönüştürmesini gerçekleştirir. türünden türüne E
T
açık dönüştürme yoksa, derleme zamanı hatası oluşur. Çalışma zamanında, açık dönüştürme başarılı olmayabilir ve bir atama ifadesi özel durum oluşturabilir.
Aşağıdaki örnekte açık sayısal ve başvuru dönüştürmeleri gösterilmektedir:
double x = 1234.7;
int a = (int)x;
Console.WriteLine(a); // output: 1234
IEnumerable<int> numbers = new int[] { 10, 20, 30 };
IList<int> list = (IList<int>)numbers;
Console.WriteLine(list.Count); // output: 3
Console.WriteLine(list[1]); // output: 20
Desteklenen açık dönüştürmeler hakkında bilgi için C# dil belirtimininAçık dönüştürmeler bölümüne bakın. Özel açık veya örtük tür dönüştürme tanımlama hakkında bilgi için bkz . Kullanıcı tanımlı dönüştürme işleçleri.
Diğer kullanımları ()
Ayrıca bir yöntemi çağırmak veya temsilci çağırmak için parantez kullanırsınız.
Parantezlerin diğer kullanımı, ifadedeki işlemlerin değerlendirilme sırasını ayarlamaktır. Daha fazla bilgi için bkz. C# işleçleri.
typeof işleci
işleci typeof
bir tür için örneği alır System.Type . aşağıdaki örnekte gösterildiği gibi işlecin bağımsız değişkeni typeof
bir tür veya tür parametresinin adı olmalıdır:
void PrintType<T>() => Console.WriteLine(typeof(T));
Console.WriteLine(typeof(List<string>));
PrintType<int>();
PrintType<System.Int32>();
PrintType<Dictionary<int, char>>();
// Output:
// System.Collections.Generic.List`1[System.String]
// System.Int32
// System.Int32
// System.Collections.Generic.Dictionary`2[System.Int32,System.Char]
Bağımsız değişken, meta veri ek açıklamaları gerektiren bir tür olmamalıdır. Örnek olarak aşağıdaki türler verilebilir:
dynamic
string?
(veya boş değer atanabilir herhangi bir başvuru türü)
Bu türler meta verilerde doğrudan temsil değildir. Türler, temel alınan türü açıklayan öznitelikleri içerir. Her iki durumda da temel alınan türü kullanabilirsiniz. dynamic
yerine kullanabilirsinizobject
. string?
yerine kullanabilirsinizstring
.
İşleci ilişkisiz typeof
genel türlerle de kullanabilirsiniz. İlişkisiz genel türün adı, tür parametrelerinin sayısından bir az olan uygun sayıda virgül içermelidir. Aşağıdaki örnekte, işlecin ilişkisiz genel türle kullanımı typeof
gösterilmektedir:
Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]
İfade, işlecin bağımsız değişkeni typeof
olamaz. bir ifade sonucunun System.Type çalışma zamanı türü örneğini almak için yöntemini kullanın Object.GetType .
işleciyle typeof
tür testi
İfade sonucunun typeof
çalışma zamanı türünün belirli bir türle tam olarak eşleşip eşleşmediğini denetlemek için işlecini kullanın. Aşağıdaki örnek, işleciyle yapılan tür denetimi ile typeof
is işleci arasındaki farkı gösterir:
public class Animal { }
public class Giraffe : Animal { }
public static class TypeOfExample
{
public static void Main()
{
object b = new Giraffe();
Console.WriteLine(b is Animal); // output: True
Console.WriteLine(b.GetType() == typeof(Animal)); // output: False
Console.WriteLine(b is Giraffe); // output: True
Console.WriteLine(b.GetType() == typeof(Giraffe)); // output: True
}
}
İşleç aşırı yüklenebilirliği
is
, as
ve typeof
işleçleri aşırı yüklenemez.
Kullanıcı tanımlı bir tür işleci aşırı yükleyemez ()
, ancak bir atama ifadesi tarafından gerçekleştirilebilecek özel tür dönüştürmeleri tanımlayabilir. Daha fazla bilgi için bkz . Kullanıcı tanımlı dönüştürme işleçleri.
C# dili belirtimi
Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın: