Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Приведение: (NewType) против объекта как NewType
Возможный Дубликат:
Приведение против использования ключевого слова 'as' в CLR
Возможный Дубликат:
Приведение против использования ключевого слова 'as' в CLR
В чем же на самом деле разница между этими двумя слепками?
SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;
Как правило, они оба должны быть явными приведениями к указанному типу?
Первый вызовет исключение, если исходный тип не может быть приведен к целевому типу. Последнее приведет к тому, что sc2 будет ссылкой null, но не исключением.
[Редактировать]
Мой первоначальный ответ, безусловно, является наиболее заметным отличием , но, как отмечает Эрик Липперт , это не единственное. Другие различия включают в себя:
- Нельзя использовать оператор 'as' для приведения к типу, который не принимает 'null' в качестве значения
- Вы не можете использовать 'as' для преобразования таких вещей, как числа в другое представление (например, float в int).
И наконец, используя 'as' против оператора cast, вы также говорите "I'm not sure if this will succeed."
Типизация с использованием "as", конечно, намного быстрее, когда приведение завершается неудачей, так как это позволяет избежать затрат на создание исключения.
Но это не быстрее, когда бросок удается. График на уровне http://www.codeproject.com/KB/cs/csharpcasts.aspx вводит в заблуждение, потому что он не объясняет, что он измеряет.
Суть в следующем:
Если вы ожидаете, что приведение будет успешным (т. е. неудача будет исключительной), используйте приведение.
Если вы не знаете, получится ли это, Используйте оператор "as" и проверьте результат для null.
Разница между этими двумя подходами заключается в том, что первый ((SomeClass)obj) может вызвать вызов преобразователя типов .
Ну а оператор 'as' "helps" вы похороните свою проблему гораздо ниже , потому что, когда он предоставляет несовместимый экземпляр, он возвращает null, возможно, вы передадите его методу, который передаст его другому и так далее, и, наконец, вы получите NullReferenceException, что сделает вашу отладку сложнее.
Не злоупотребляйте им. Оператор прямого приведения лучше в 99% случаях.
Вот хороший способ запомнить процесс, которому следует каждый из них, который я использую, пытаясь решить, что лучше для моих обстоятельств.
DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);
а дальше уже должно быть легко догадаться что он делает
DateTime i = value as DateTime;
в первом случае, если значение не может быть приведено, то создается исключение, во втором случае, если значение не может быть приведено, i устанавливается в значение null.
Поэтому в первом случае делается жесткая остановка, если приведение не удается, во втором приведении делается мягкая остановка, и вы можете столкнуться с NullReferenceException позже.
Чтобы расширить комментарий Rytmis, вы не можете использовать ключевое слово as для структур (типов значений), так как они не имеют значения null.
Все это относится к ссылочным типам, типы значений не могут использовать ключевое слово as , поскольку они не могут быть 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;
Синтаксис приведения быстрее, но только при успешном выполнении он гораздо медленнее завершается неудачей.
Лучше всего использовать as , когда вы не знаете тип:
//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
}
Однако если вы абсолютно уверены, что someObject является экземпляром SomeClass , то используйте приведение.
В .Net 2 или выше обобщения означают, что вам очень редко нужно иметь нетипизированный экземпляр ссылочного класса, поэтому последний используется реже.
Они будут делать разные исключения.
(): NullReferenceException
как : InvalidCastException
Что могло бы помочь в отладке.
Ключевое слово "as" пытается привести объект, и если приведение завершается неудачей, то null возвращается молча. Оператор приведения () немедленно создаст исключение, если приведение завершится неудачей.
-Используйте ключевое слово C# "as" только в тех случаях, когда вы ожидаете, что приведение завершится неудачей в не исключительном случае. Если вы рассчитываете на успешное приведение и не готовы получить любой объект, который потерпел бы неудачу, вы должны использовать оператор приведения (), чтобы создать соответствующее и полезное исключение."
Для примеров кода и дальнейшего объяснения: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html