Casting: (NewType) vs. Object as NewType [duplicate]
Jaka jest właściwie różnica między tymi dwoma odlewami?Możliwy duplikat:
Casting a użycie słowa kluczowego " as " w CLR
SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;
Normalnie oba powinny być jawne dla określonego typu?
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."
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.
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.
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 .
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.
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.
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.
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.
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ę.
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
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.
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.
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.
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