Casting: (NewType) vs. Object as NewType [duplicate]

Możliwy duplikat:
Casting a użycie słowa kluczowego " as " w CLR

Jaka jest właściwie różnica między tymi dwoma odlewami?
SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

Normalnie oba powinny być jawne dla określonego typu?

 79
Author: Community, 2008-08-05

13 answers

Pierwszy rzuci wyjątek, jeśli Typ źródłowy nie może zostać oddany do typu docelowego. To ostatnie spowoduje, że sc2 będzie referencją null, ale bez wyjątku.

[Edytuj]

Moja oryginalna odpowiedź jest z pewnością najbardziej wyraźną różnicą, ale jak zauważa Eric Lippert , nie jest jedyna. Inne różnice to:

  • nie można użyć operatora 'as' do przypisania typu, który nie akceptuje 'null' jako wartości
  • nie możesz używać 'as' do konwertuje rzeczy, takie jak liczby do innej reprezentacji(float do int, na przykład).

I wreszcie, używając' as 'vs. Operator obsady, mówisz także:" nie jestem pewien, czy to się uda."

 83
Author: Rytmis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 05:33:21

Zauważ również, że możesz używać tylko słowa kluczowego as z typem odniesienia lub typem nullable

Ie:

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

Nie skompiluje

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

Skompiluje.

 27
Author: denny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 16:15:38

Typecasting za pomocą " as " jest oczywiście znacznie szybszy, gdy obsada nie powiedzie się, ponieważ pozwala uniknąć kosztów rzucania WYJĄTKÓW.

Ale nie jest szybciej, gdy Obsada się powiedzie. Wykres w http://www.codeproject.com/KB/cs/csharpcasts.aspx wprowadza w błąd, ponieważ nie wyjaśnia, co mierzy.

Reasumując:

  • Jeśli oczekujesz, że obsada się powiedzie (np. porażka byłaby wyjątkowa), użyj obsady.

  • Jeśli nie wiesz czy to się powiedzie, użyj operatora" as " i przetestuj wynik na null.

 10
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 10:58:12

Różnica między tymi dwoma podejściami polega na tym, że pierwszy ((SomeClass)obj) może spowodować wywołanie konwertera typu .

 5
Author: Cristian Libardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 23:46:49

Oto dobry sposób, aby zapamiętać proces, który każdy z nich podąża, którego używam, próbując zdecydować, który jest lepszy dla mojej sytuacji.

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

I następne powinno być łatwe do odgadnięcia, co robi

DateTime i = value as DateTime;

W pierwszym przypadku jeśli wartość nie może być rzucona, to w drugim przypadku jeśli wartość nie może być rzucona, i jest ustawione na null.

Więc w pierwszym przypadku twarde zatrzymanie jest wykonane, jeśli obsada nie powiedzie się w drugim Obsada miękki jest wykonany i można później napotkasz NullReferenceException.

 4
Author: Nick Berardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 17:46:00

Cóż operator 'as '"pomaga" pogrzebać twój problem znacznie niżej ponieważ gdy zostanie dostarczona niezgodna instancja zwróci null, może przekażesz ją metodzie, która przekaże ją innej i tak dalej, a w końcu otrzymasz Nullreferencexception, co utrudni debugowanie.

Nie nadużywaj tego. Operator direct cast jest lepszy w 99% przypadków.

 4
Author: Andrei Rînea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 09:21:44

Aby rozwinąć komentarz Rytmis, nie można użyć jako słowa kluczowego dla struktur (typów wartości), ponieważ nie mają one wartości null.

 3
Author: Omer van Kloeten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:36

Wszystko to dotyczy typów referencyjnych, typy wartości nie mogą używać słowa kluczowego as, ponieważ nie mogą 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 obsady jest szybsza, ale tylko wtedy, gdy się powiedzie, znacznie wolniej jest zawieść.

Najlepszą praktyką jest użycie as, gdy nie znasz typu:

//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
}

Jeśli jednak jesteś absolutnie pewien, że someObject jest instancją SomeClass, użyj cast.

W. Net 2 lub nowszym generics oznacza, że bardzo rzadko trzeba mieć niepodpisaną instancję referencji klasy, więc ta ostatnia jest rzadziej używana.

 2
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 12:54:56

Nawias rzuca wyjątek, jeśli próba oddania nie powiedzie się. Obsada " as " Zwraca wartość null, jeśli próba obsady nie powiedzie się.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 15:45:06

Będą rzucać różne wyjątki.
(): NullReferenceException
as: InvalidCastException
Co może pomóc w debugowaniu.

Słowo kluczowe "as" próbuje oddawać obiekt i jeśli oddanie się nie powiedzie, zwracane jest po cichu null. Operator () rzuci wyjątek natychmiast, jeśli Obsada się nie powiedzie.

" używaj tylko słowa kluczowego C# "jako" tam, gdzie spodziewasz się, że obsada zawiedzie w nie-wyjątkowym przypadku. Jeśli liczysz na sukces gipsu i jesteś nieprzygotowany aby otrzymać obiekt, który się nie powiedzie, należy użyć operatora () cast, aby rzucić odpowiedni i pomocny wyjątek."

Przykłady kodu i dalsze wyjaśnienie: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

 1
Author: Steve Willard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 15:49:34

To jak różnica między Parse i TryParse. Używasz TryParse, gdy spodziewasz się, że może się nie udać, ale gdy masz silną pewność, że nie zawiedzie, używasz Parse.

 1
Author: ICR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-08 12:00:01

Dla tych z VB.NET experience, (type) jest taki sam jak DirectCast i "As type" jest taki sam jak TryCast.

 1
Author: Adam Ruth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 21:55:28

I ze względu na kompletność, Eric Lippert ma post na blogu o różnicy i niektórych zastrzeżeniach.

 1
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 00:04:13