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 T T dönüştürmesi bundan 'a T var.

  • bir ifade sonucun çalışma zamanı türü, temel alınan türü ile null değere sahip bir değer t T Nullable<T>.HasValue 'tir ve true olur.

  • bir ifadenin çalışma zamanı türünden türüne kadar olan bir kutulama veya kutudan çıkan dönüştürme T var.

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:

  • dynamic
  • string? (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:

Ayrıca bkz.