is operatörü bir nesnenin verilen tipte olup olmadığını kontrol eder. İşlem sonucunda da Boolean bir değer döndürür. Hiçbir zaman bir exception fırlatmaz. Basit olarak;
Object o=new Object();
Boolean deger1=(o is Object); // işlem sonucu deger1 true değerini alacaktır.
Boolean deger2=(o is Car); //İşlem sonucu deger2 false değerini alacaktır.
is operatörü ile yapılan kontrollerde eğer verilen nesnenin referansı null ise herzaman false değeri geri dönecektir çünkü tipinin kontrol edileceği geçerli bir nesne yoktur. Genel olarak is operatörünü şu haliyle kullanabiliriz;
if (o is Car)
{
Car c = (Car) o;
}
Kodu birde CLR in gözü ile incelersek; burda nesnenin tip kontrolü iki kez yapılmaktadır. İlk önce is operatörü ile eğer işlem sonucu true ise bu seferde cast işleminde kontrol yapılmaktadır. CLR ın tip kontrolü güvenlik için önemli bir nokta fakat bu artı beraberinde performans kaybını da getirmektedir. Şöyle açıklayabiliriz;CLR ilk olarak o nesnesi tarafından referans alınan nesnenin gerçek tipini saptamalıdır ve bu işlemden sonrada nesnenin(Car) miras alma hiyerarşisinde her bir tipi Car nesnesinin tipine göre kontrol etmelidir.
is operatörünün bu performans problemine nazaran C# bize performans kaybını azaltmak için as operatörünü önermektedir.
Car c = o as Car;
if (c != null)
{
//işlem
}
Bu örnekte ise CLR o nesnesinin Car tipi ile uyumluluğunu kontrol etmekte, eğer uygunluk varsa geriye aynı nesnenin null olmayan bir referansını geriye döndürür. Uyumlu olmadığı durumda ise geriye null döndürür. Burada ilk örneğe göre(is operatörüne göre) dikkat edilmesi nokta CLR nesnenin tipini sadece bir kez kontrol etmektedir ki buda is operatörüne göre daha hızlı bir tip dönüşüm işlemi gerçekleştirmemizi sağlar.