Odlewniczy (newtype) w porównaniu do przedmiotu jako newtype

głosy
79

Powiel możliwe:
Casting vs pomocą „jako” słowo kluczowe w CLR

Czym jest właściwie różnica między tymi dwoma odlewów?

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

Normalnie powinny one być zarówno jawnych odlewane do określonego typu?

Utwórz 05/08/2008 o 16:42
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
82

Były rzuci wyjątek, jeśli typ źródła nie można rzutować na typ docelowy. Ta ostatnia skutkiem tego w SC2 będąc zerowego odniesienia, ale bez wyjątku.

[Edytować]

Mój oryginalny odpowiedź jest z pewnością najbardziej widoczna różnica, ale Eric Lippert zwraca uwagę , że nie jest jedynym. Inne różnice to:

  • Nie można użyć operatora „jako” do oddania do typu, który nie akceptuje „null” jako wartość
  • Nie można używać „jako” do konwersji rzeczy, jak numery do różnych reprezentacji (pływaka do int, na przykład).

I wreszcie, stosując „jako” vs. operatora szarego, jesteś również mówiąc: „Nie jestem pewien, czy to uda.”

Odpowiedział 05/08/2008 o 16:44
źródło użytkownik

głosy
27

Należy również pamiętać, że można używać tylko jako słowo kluczowe z typem referencyjnym lub typu wartości pustych

to znaczy:

double d = 5.34;
int i = d as int;

nie będzie kompilować

double d = 5.34;
int i = (int)d;

skompiluje.

Odpowiedział 05/08/2008 o 17:15
źródło użytkownik

głosy
9

Typecasting używając „jak” jest oczywiście znacznie szybciej, gdy obsada nie powiedzie się, ponieważ unika koszt rzucania wyjątek.

Ale to nie szybciej, gdy obsada powiedzie. Wykres na http://www.codeproject.com/KB/cs/csharpcasts.aspx jest mylące, ponieważ nie wyjaśnia, co to jest pomiar.

Najważniejsze jest to:

  • Jeśli oczekujesz oddanych do osiągnięcia sukcesu (czyli awaria będzie wyjątkowy), użyj obsady.

  • Jeśli nie wiem, czy się uda, użyj „jako” operatora i sprawdzić wynik na null.

Odpowiedział 16/09/2008 o 20:21
źródło użytkownik

głosy
5

Różnica między tymi dwoma podejściami jest to, że pierwszy ((SomeClass) obj) może spowodować, że przetwornik typu nazywać.

Odpowiedział 08/11/2008 o 00:46
źródło użytkownik

głosy
4

Dobrze „jako” operator „pomaga” pogrzebać problem sposobem niższa , ponieważ gdy jest niezgodny instancji zwróci null, może miniesz, że jest sposób, który będzie przekazywać go do drugiego i tak dalej i wreszcie cię” ll uzyskać NullReferenceException które uczynią Państwa debugowanie trudniejsze.

Nie nadużywać go. Bezpośrednim operatorem obsada jest lepszy w 99% przypadków.

Odpowiedział 28/10/2010 o 10:21
źródło użytkownik

głosy
4

Tutaj jest dobrym sposobem, aby pamiętać, że proces każdego z nich wynikać, że mogę używać, gdy stara się zdecydować, co jest lepsze dla mojego sytuacji.

DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);

a następnego powinny być łatwe do odgadnięcia, co robi

DateTime i = value as DateTime;

w pierwszym przypadku, jeżeli wartość nie może być rzucony niż jest wyjątek w drugim przypadku, jeżeli wartość nie może być oddane, i jest ustawiona na null.

Tak więc w pierwszym przypadku trudno jest przystanek jeśli obsada nie w drugiej obsadzie miękki stop jest złożony i może napotkać NullReferenceException później.

Odpowiedział 05/08/2008 o 18:46
źródło użytkownik

głosy
3

Aby rozwinąć na komentarz Rytmis jest , nie można użyć jako hasła na elemencie (typy value), ponieważ nie mają one wartość null.

Odpowiedział 07/09/2008 o 09:08
źródło użytkownik

głosy
2

Wszystko to odnosi się do odniesienia typy, typy wartości nie można użyć assłowa kluczowego, ponieważ nie może być null.

//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;


//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;

Składnia obsada jest szybsza, ale tylko wtedy, gdy uda, to znacznie wolniej na niepowodzenie.

Najlepszym rozwiązaniem jest, aby używać as, gdy nie wiem, typ:

//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;

//use as to find the right type
if( ( sc = someObject as SomeClass ) != null ) 
{
    //do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null ) 
{
    //do something with soc
}

Jednak jeśli jesteś absolutnie pewien, że someObjectjest instancją SomeClassnastępnie użyć obsady.

W .NET 2 lub powyżej generycznych znaczy, że bardzo rzadko trzeba mieć wystąpienie un wpisany z klasy referencyjnej, więc ten ostatni jest stosowany rzadziej.

Odpowiedział 18/09/2008 o 12:10
źródło użytkownik

głosy
1

I ze względu na kompletność, Eric Lippert ma blogu o różnicy i kilka zastrzeżeń.

Odpowiedział 09/10/2009 o 01:04
źródło użytkownik

głosy
1

Dla tych z Was, z doświadczenia, VB.NET (typ) jest taka sama jak DirectCast i „jako typ” jest taka sama jak TryCast.

Odpowiedział 16/09/2008 o 22:55
źródło użytkownik

głosy
1

To jak różnica między analizowania i TryParse. Użyć TryParse kiedy można się spodziewać to może nie, ale kiedy masz silną pewność, że nie zawiedzie użyć przetworzenia.

Odpowiedział 08/08/2008 o 13:00
źródło użytkownik

głosy
1

Będą rzucać różne wyjątki.
(): NullReferenceException
jak: InvalidCastException
które mogłyby pomóc do debugowania.

„Jak” próby słów kluczowych do oddania obiektu i jeśli obsada nie powiedzie, zwracana jest wartość null cicho. The () operator obsada natychmiast rzucić wyjątek, jeśli obsada nie powiedzie się.

„Używać tylko C #«jako»słowo kluczowe, gdzie oczekują obsady niepowodzenie w non-wyjątkowym przypadku. Jeśli liczą na gipsie, aby odnieść sukces i są przygotowani do przyjmowania żadnych przedmiotów, które zawiodą, należy użyć () cast operatora tak, że odpowiednia i pomocny jest wyjątek.”

Do przykładów kodu i wyjaśnienia: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

Odpowiedział 05/08/2008 o 16:49
źródło użytkownik

głosy
1

Obsada nawiasie zgłasza wyjątek, jeśli nie powiedzie się próba odlewane. „Jak” cast zwraca null, jeśli nie powiedzie się próba odlewane.

Odpowiedział 05/08/2008 o 16:45
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more