2012-11-29 12 views
15

Co to jest korzystanie z operatora is?Co to jest dobre użycie operatora is-

Konstrukcja poniżej dla odlewu nie jest zalecaną metodą, praktycznie cała dokumentacja preferuje operatora asysty z kontrolą zerową.

if(obj is SomeClass) 
{ 
    SomeClass some = (SomeClass)obj; 
    .... 
} 

I na pewno jest to (bardzo mały) wzrost wydajności, a niektórzy nawet wspominają o bezpieczeństwie bieżnika. I tak, to prawda ...

Dlaczego więc mamy operatora-operatora?
Gdzie "operator z kontrolą zerową" nie działa lub nie jest do zrobienia?
Czy można ograniczyć zakres deklaracji, którą uzyskujesz, korzystając z operatora is?

+1

Myślę, że sytuacja polega na tym, że jeśli chcesz przetestować typ czegoś, ale nie musisz przypisywać go do zmiennej i używać go? –

+2

[Czy jest taki sam jak jest?] (Http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-as-is-is-as-is.aspx) –

+1

@Zev: To brzmi tak, jakby Eric miał zbyt dużo spadku: _ "de jure jest is is, a taki jaki jest, ale de facto jest taki sam jak isinst" _ :) –

Odpowiedz

11

as nie działa z nie-pustych struct s:

object o = 123; 
int i = o as int; // compile error 

Jednakże:

object o = 123; 
if(o is int) { 
    int i = (int)o; 
    //... 
} 

oczywiście, od 2,0 roku można również użyć:

int? i = o as int?; 

i przetestować jak zwykle.

Jest również scenariusz, że nie dbam o wartości przedmiotu ... po prostu trzeba wiedzieć, co to jest:

if(obj is Something) 
    throw new InvalidOperationException("Seriously, don't do that"); 
// phew! dodged a bullet; we're ok here... 

Zauważ, że GetType() nie jest odpowiedni dla tego , ponieważ nie chcesz ręcznie rozważać podklas, interfejsów itp.

+1

Ten link jest warty czytanie w tym zakresie http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx –

+1

@Tim good spot , ale chociaż jest to * prawda *, nie ma wpływu na różnicę między 'is' i' as'. Wpływa na "as" vs * cast *. –

Powiązane problemy