Tür testi işleçleri ve tür ifadeleri (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:
- işleci:Bir ifadenin çalışma zamanı türünün verilen türle uyumlu olup olmadığını denetleme
- as işleci:Bir ifadeyi, çalışma zamanı türü bu türle uyumlu ise açıkça bir türe dönüştür
- cast ifadesi:Açık bir dönüştürme gerçekleştirme
- typeof işleci: System.Type Bir tür için örneği alma
is işleci
isişleci, bir ifadenin çalışma zamanı türünün, verilen bir türle uyumlu olup olmadığını denetler. C# 7.0'dan itibaren is işleç, bir ifadenin sonucu desene karşı da test etti.
Tür testi işleci olan is ifade aşağıdaki biçime sahip
E is T
burada, E bir değer döndüren bir T ifadedir ve bir türün veya tür parametresinin adıdır. E anonim bir yöntem veya lambda ifadesi olarak kullanılamaz.
bir is ifade sonucu null olmayan ve aşağıdaki koşullardan herhangi biri true olduğunda true işleci döndürür:
bir ifadenin çalışma zamanı türü
Tşeklindedir.Bir ifadenin çalışma zamanı türü türünden türetilen, arabirimini uygulayan veya başka bir örtülü başvuru
TTdönüştürmesi bundan 'aTvar.bir ifade sonucun çalışma zamanı türü, temel alınan türü ile null değere sahip bir değer t
TNullable<T>.HasValue 'tir vetrueolur.bir ifadenin çalışma zamanı türünden türüne kadar olan bir kutulama veya kutudan çıkan dönüştürme
Tvar.
isişleci, kullanıcı tanımlı dönüştürmeleri göz önünde bulundurmaz.
Aşağıdaki örnek, bir ifadenin çalışma zamanı türü belirli bir türden türetildi, yani türler arasında bir başvuru dönüştürmesi varsa işlecinin is true döndür olduğunu 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 örnek, işlecinin kutulama ve kutudan açma dönüştürmelerini hesaba eklese de sayısal is dönüştürmeleri dikkate ala olmadığını gösterir:
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 belirtimlerinin Dönüştürmeler bölümüne bakın.
Desen eşleştirme ile tür testi
C# 7.0'dan itibaren is işleç, bir ifadenin sonucu desene karşı da test etti. Aşağıdaki örnek, bir ifadenin çalışma zamanı türünü kontrol etmek için bildirim deseninin nasıl kullanılageldi:
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
asişleci, bir ifadenin sonucu açıkça verilen bir başvuruya veya null değere dönüştürülebilir değer türüne dönüştürür. Dönüştürme mümkün değilse işleci as null döndürür. Bir cast ifadesininaksine, as işleci hiçbir zaman bir özel durum oluşturur.
Formun ifadesi
E as T
burada, bir değer döndüren bir ifadedir ve bir türün veya tür parametresinin adıdır, ile E T aynı sonucu üretir
E is T ? (T)(E) : (T)null
ancak E bu yalnızca bir kez değerlendirilir.
işleci as yalnızca başvuru, null değere değiştirilebilir, kutulama ve kutulamadan açma dönüştürmelerini göz önünde bulundurabilir. Kullanıcı tanımlı dönüştürme gerçekleştirmek as için işleci kullanaazın. Bunu yapmak için bir cast ifadesi kullanın.
Aşağıdaki örnek, işlecinin kullanımını as gösterir:
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 de olduğu gibi, dönüştürmenin başarılı olup olduğunu kontrol etmek as için null ifadenin sonucuyla karşılaştırmalısiniz. C# 7.0'dan itibaren, dönüştürmenin başarılı olup olamayacaklarını test etmek ve başarılı olursa sonucu yeni bir değişkene atamak için is işleci kullanabilirsiniz.
İfadeyi at
Formun bir tür dönüştürme (T)E ifadesi, ifadenin sonucun türüne açık bir dönüştürme E T gerçekleştirir. türünden türüne açık bir dönüştürme E T yoksa, derleme zamanı hatası oluşur. Çalışma zamanında, açık bir dönüştürme başarılı olamaz ve bir tür dönüştürme ifadesi bir özel durum oluşturur.
Aşağıdaki örnek, açık sayısal ve başvuru dönüştürmelerini gösterir:
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 belirtimlerinin Açık dönüştürmeler bölümüne bakın. Özel açık veya örtülü 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ı
Bir yöntemi çağırmak veya temsilci çağırmak için parantez de kullanırsiniz.
Parantezlerin diğer kullanımları, bir ifadede işlemlerin değerlendirilme sıralaması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 elde System.Type ediyor. İşleç bağımsız değişkeni, aşağıdaki örnekte de olduğu gibi bir tür veya typeof 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şkeni, meta veri ek açıklamaları gerektiren bir tür olması gerekir. Örnekler aşağıdaki türleri içerir:
dynamicstring?(veya herhangi bir boş değere değiştirilebilir başvuru türü)
Bu türler doğrudan meta verilerde temsil edilen türler değil. Türler, temel alınan türü tanımlayan öznitelikleri içerir. Her iki durumda da temel alınan türü kullanabilirsiniz. yerine dynamic object kullanabilirsiniz. yerine string? string kullanabilirsiniz.
İşleci, sınırsız typeof genel türlerle de kullanabilirsiniz. Bir sınırsız genel türün adı, tür parametrelerinin sayısından bir küçük olan uygun sayıda virgül içermesi gerekir. Aşağıdaki örnek, işlecinin typeof gelen olmayan genel tür ile kullanımını gösterir:
Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]
İfade, işlecinin bağımsız değişkeni typeof olarak yer alamdır. bir ifade System.Type sonucu çalışma zamanı türünün örneğini almak için yöntemini Object.GetType kullanın.
işleciyle tür typeof testi
İfadenin çalışma zamanı türünün verilen bir türle tam typeof olarak eş olup olamayacaklarını kontrol etmek için işleci kullanın. Aşağıdaki örnek, işleciyle yapılan tür denetimi ile is typeof işleci arasındaki farkı gösteriyor:
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üklemesi
is, as ve typeof işleçleri aşırı yük olamaz.
Kullanıcı tanımlı tür, işleci aşırı yük devrederek bir tür dönüştürme ifadesi tarafından gerçekleştirilecek () ö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 belirtimlerinin aşağıdaki bölümlerine bakın: