2009-11-02 18 views
6

Co to są powszechne i nie tak często używane wzorce dla hasła C# "jest". Niedawno użyłem go do zliczenia liczby użytych komórek w tablicy maszynowej (nadal utknęły na dole z wygenerowanymi klasami xsd, ponieważ xsd2code miał szereg problemów z zaprojektowanym przez IETF schematem, a więc nie generycznych).C# Wzory użycia słowa kluczowego "is"

Jakie inne powszechne i co ważniejsze typowe wzorce użytkowania są oferowane.

+1

Myślę, że najczęściej stosowany jest wzór do tego, co robi ...(reszta jest raczej niezbyt często), jak w A jest B lub A implementuje B. –

Odpowiedz

14

Słowo kluczowe "is" jest przydatne do określenia, czy obiekt można przekształcić w typ za pomocą odwołania, boksu lub rozpakowania (C# Lang 7.9.10). Jest podobny do "jak", z tym że nie dokonuje konwersji, a jedynie zwraca, jeśli jest to możliwe.

Przydaje się w każdym scenariuszu, w którym wiedza, czy dany obiekt można przekształcić w typ, jest przydatna, ale posiadanie obiektu przez odniesienie do tego typu nie jest konieczne.

if (o is SomeType) { 
    TakeSomeAction(); 
} 

Jeśli ma odniesienie do określonego typu na wartość jest przydatna wówczas bardziej efektywne użycie „jako operatora zamiast”.

// Wrong 
if (o is SomeType) { 
    SomeType st = (SomeType)o; 
    st.TakeSomeAction(); 
} 

// Right 
SomeType st = o as SomeType; 
if (st != null) { 
    st.TakeSomeAction(); 
} 
6

Właściwie prawie nigdy z niego nie korzystam. Kiedy go potrzebuję, zazwyczaj dlatego, że i tak będę przesyłać wartość do wymaganego typu, więc wolę używać jako takiej.

Porównaj:

if (x is MyType) 
{ 
    MyType y = (MyType)x; 
    ... 
} 

I:

MyType y = x as MyType; 
if (y != null) 
{ 
    ... 
} 

W pierwszym przypadku: 2 operacje (1 typ kontroli + 1 cast)

W drugim przypadku: 1 operacja (typ sprawdź + rzut w jednym ujęciu)

+0

Jeśli moja pamięć mi służy Cóż, wyemitowany kod il jest w zasadzie taki sam –

+1

Po prostu sprawdziłem z Reflectorem, to nie jest ... W każdym razie nie mają sens, ponieważ te dwa podejścia są semantycznie różne (na przykład "jak" może być używane tylko z typami odniesienia) –

1

Nie pamiętam, kiedykolwiek użyto is. W większości przypadków, jeśli chcesz wiedzieć, czy instancja jest określonego typu, musisz jej użyć jako takiej.

Tak więc zwykle wylewa się go bezpośrednio przy użyciu as lub jawnego odlewania, jeśli jestem pewien, że faktycznie jest tego typu.

Próbuję napisać kod, którego nie trzeba rzucać ani znajdować informacji o typie więcej niż raz. Zatem pisanie is przed rzutowaniem typu referencyjnego z pewnością nie jest godne polecenia.

+0

"jest", zanim rzucenie jest jedynym sposobem bezpiecznego rzucenia "obiektów" na wartościowe typy tak, jak "chce" być w stanie zwrócić wartość zerową, która nie jest obsługiwana dla typów wartości. –

+0

@Hans: Tak, masz rację, przeformułuję ją tak, aby była specyficzna dla typów odniesienia. –

0

Z nadchodzącym v4 zamiast używania jest i ponieważ istnieje inne możliwe podejście.

void somemethod(dynamic o) 
{ 
DoStuff(o); 
} 

DoStuff(neededType o){} 
DoStuff(object o){} 

że jednak może mieć przebój WYDAJNOŚCIĄ ale sprawia miłą czytelności

0

To zależy, czy potrzebne jest odniesienie do rodzaju czy to is rodzajem danego typu. Jeśli tak jest, powinieneś użyć `jak keyworkd.

MyObject mo = obj as MyObject; 
if (mo == null) { 
    // do something. 
} else { 
    // do something else. 
} 

co dałoby odniesienie, które można przetestować na zero. W przeciwnym razie, korzystając z opratora as, musisz i tak wykonać rzut.

Powiązane problemy