2010-12-02 31 views
7

Bir nesnenin X tipi olmadığını kontrol etmek bazen mantıklıdır, bu yüzden bunu yerine yapmanız gerekir:Neden "# değil" anahtar kelimesi var mı?

 if(this.GetType() != typeof(X)) 
{ 
     //Do my thing. 

} 

Benim düşünceme göre biraz hantal, bu daha hoş bir şey olmaz:

 if(this is not X) 
{ 
    //Do my thing 
} 
+0

Eğer 'X', this.GetType()' ın bir alt tipi ise, bunlar işlevsel olarak eşdeğer olmayacaktır. –

cevap

20

Diğerleri ise, bir nesnenin sınıfının bir sınıftan miras alınıp alınmadığını veya GetType()'dan oldukça farklı olan bazı arabirimleri uygulayıp uygulamadığını kontrol etmek için is da kullanılır. C# not anahtar kelimesinin neden C# 'de neden olduğu konusunda makul açıklamaları vardır.

CodeInChaos ve StriplingWarrior.

+1

Bir anahtar kelime yapmamız gerekmeyecek. Muhtemelen 'getiri getirisine' benzer bir anahtar kelime yapmamak yeterli olacaktır. Çoğu C# programcısı iki kelime anahtar kelimesine kullanılmadığı için biraz kafa karıştırıcı olabilir mi (ya da onlara anahtar kelimeler mi demeliyim?). Yani kimse IMO'nun çirkin görünmesi için 'imnot'u kullanmak zorunda kalacaktı. – CodesInChaos

+1

"!" Sayfasını görmek istiyorum Açık bir anlamı olan, ancak şu anda yasal olmayan bazı özel durumlarda C'ye izin verilir. Bir vaka parantezin dışında olsa da, vb.(Bu bağlamda, operatör aşırı yüklenmelerine bakılmaksızın koşulu kesinlikle tersine çevirmelidir). Böyle bir durum daha iyi olabilir: "parantez" i önlemek için "bu! – supercat

4

Kullanım iyi ol' patlama sembolü: bu sadece yaprak türetilmiş sınıf, ama bunun bütün hiyerarşi, arayüzler ve sınıflar hem yakalar çünkü

if (!(pero is Human)) 
{ 

} 

BTW, is farklıdır.

Yani,

class Human: ICanSpeak, Mamal 
{ 
... 
} 

Human h; 

if (h is Human) { will be true } 
if (h is ICanSpeak) { will be true } 
if (h is Mamal) { will also be true } 
5

Not bu this.GetType()! = Bu elde edilmiş olduğu takdirde yanlış (veya uygulayan bir arabirim türü durumunda), fakat X özdeş olmayan, this is X döner doğru ise typeof(X) döner.

!(a is X)'u kullanabilmeniz için neden ayrı bir anahtar kelime var? Bu dili az kazançlı bir şekilde şişiriyor. Eric Lippert, her yeni dil özelliğinin kodlama, belgeleme, test etme ve tabii ki dilin karmaşıklığını arttırmak için yeterli avantajlar sunması gerektiğini vurgulamaktan hoşlanır. Ve bir not is operatörü yeterli teklif vermez. karmaşıklık ekler

public static bool IsNot<T>(this object obj) 
{ 
    return !(obj is T); 
} 
+4

Nesne üzerinde uzatma yöntemlerinin sorgulanabilir bir programlama uygulaması olduğu gerçeğinin yanı sıra, aslında oradaki kötü küçük bir uzantı yöntemi değil. Kullanacağımı söylemiyorum ama bence oldukça mantıklı. –

+0

@Eric: C# 'ye ek olarak bir operatörün "değil" de olmasını isterdim! Birisi bu işe yaramaz ama söyleyebiliriz! "eğer değilse (vector.IsNormalized)" görsel olarak ayrıştırmaktan çok daha kolay olduğunu görmek için çok zor. , sağ? –

+2

@Eric, neden nesne uzantısı yöntemleri kötü uygulama olarak görülüyor sorabilir miyim? – dexter

9

bir dile bir anahtar kelime ekleme:

Sen bir uzantısı yöntemi uygulamak olabilir, ama o kadar aptal olduğunu düşünüyorum. İlk belirtimden sonra bir dile bir anahtar kelime eklemek, yeni sürüme geçiş yapan kullanıcılar için kırılma değişikliklerine neden olabilir. Dolayısıyla, anahtar kelimeler genellikle yalnızca onlar için çok güçlü bir durum varsa eklenir.

if (!(pero is Human)) ... 

... Tipik bir C# (/ C/C++/Java) geliştirici "değilse okurdu (: diğer cevaplar işaret Bu durumda, patlama operatörü kullanımı çok kolaydır pero insandır ". Yani özel bir anahtar kelime için fazla gerekçe yok.

+1

Örneğin, C# 'de' verim 'anahtar kelimemiz yok çünkü bu bir kırılma değişikliği olurdu. Diğer taraftan getiri getirisi (x), daha önce yasadışı bir sözdizimi idi ve bu nedenle herhangi bir kırılma değişikliği olmadı. – CodesInChaos

+1

@CodeInChaos: Evet, ancak bir "anahtar kelime" anahtar kelimesi teknik olarak "getiri getirisi" ile aynı kategoriye girebilir. Fark, "getiri geri dönüşünü" taklit etmek için çok fazla iş gerektirmesidir, oysa patlama operatörü ve parantezler taklit etmek için yeterli değildir. – StriplingWarrior

+0

Bir 'imnot 'operatörünün (boşluk olmaması) uygulanması çok kolay ve güvenli olacağına inanıyorum. C# sözdiziminin bir parçası olmak için kesinlikle oy kullanırdım. Çok hızlı kodlama yaparken neredeyse yazdım. Çok doğal geliyor. Aynı zamanda intellisense olurdu ve tüm parantez ve negation operatörünü yazarak kaydederdi. Kısacası kullanışlı olurdu. – GDS

İlgili konular