Литье: (NewType) против объекта, как NewType

голоса
79

Можно создать дубликат:
Кастинг против , используя «как» ключевое слово в CLR

Что на самом деле разница между этими двумя слепками?

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

Как правило, они оба должны быть явное приведение к заданному типу?

Задан 05/08/2008 в 16:42
источник пользователем
На других языках...                            


13 ответов

голоса
82

Первый из них будет сгенерировано исключение, если тип источника не может быть приведен к целевому типу. Последнее приведет к SC2 будучи нулевую ссылку, но не исключения.

[Редактировать]

Мой первоначальный ответ, безусловно, наиболее сильное различие, но , как Эрик Липперт указывает , что это не только один. Другие различия включают в себя:

  • Вы не можете использовать «как» оператор приведение к типу, который не принимает «нулевой» в качестве значения
  • Вы не можете использовать «как» , чтобы преобразовать вещи, как числа к другому представлению (поплавка междунар, например).

И, наконец, используя «как» против оператора литого, вы также говорите: «Я не уверен, если это удастся.»

Ответил 05/08/2008 в 16:44
источник пользователем

голоса
27

Также обратите внимание, что вы можете использовать только в качестве ключевого слова с ссылочного типа или типа обнуляемого

то есть:

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

не компилируется

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

скомпилируется.

Ответил 05/08/2008 в 17:15
источник пользователем

голоса
9

Приведение типов с использованием «как», конечно, гораздо быстрее, когда бросок терпит неудачу, поскольку это позволяет избежать расходов бросать исключение.

Но это не быстрее , когда бросок преуспевает. На графике http://www.codeproject.com/KB/cs/csharpcasts.aspx вводит в заблуждение , потому что это не объясняет , что это измерения.

Суть заключается в том:

  • Если вы ожидаете, что бросок на успех (т.е. отказ будет исключительным), используйте бросок.

  • Если вы не знаете, если это удастся, использовать «как» оператор и проверить результат на нуль.

Ответил 16/09/2008 в 20:21
источник пользователем

голоса
5

Разница между этими двумя подходами в том , что первый ((SomeClass) OBJ) может вызвать преобразователь типа будет называться.

Ответил 08/11/2008 в 00:46
источник пользователем

голоса
4

Ну «как» оператор «помогает» вы похоронить вашу проблему ниже способ , потому что , когда это предусмотрено несовместимого экземпляр он возвращает нуль, может быть , вы проедете , что метод , который передаст его другому и так далее , и , наконец , вы» LL получить NullReferenceException , который сделает вашу отладку сложнее.

Не ругайте его. Оператор прямого броска лучше в 99% случаях.

Ответил 28/10/2010 в 10:21
источник пользователем

голоса
4

Вот хороший способ вспомнить процесс, что каждый из них следует, что я использую при попытке решить, что лучше для моего обстоятельства.

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

а следующий должен быть легко догадаться, что он делает

DateTime i = value as DateTime;

в первом случае, если значение не может быть отлит, чем исключение во втором случае если значение не может быть брошено, я установлен в нуль.

Таким образом, в первом случае жесткий упор сделан, если бросок терпит неудачу во втором гипсе мягкий стоп сделан, и вы можете столкнуться с NullReferenceException позже.

Ответил 05/08/2008 в 18:46
источник пользователем

голоса
3

Для того, чтобы расширить свое присутствие на комментарий Rytmis в , вы не можете использовать в качестве ключевого слова (типы структур значений), так как они не имеют нулевое значение.

Ответил 07/09/2008 в 09:08
источник пользователем

голоса
2

Все это относится к ссылочным типам, типы значений не могут использовать asключевое слово , поскольку они не могут быть нулевыми.

//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 или выше генериков означает, что вы очень редко нужно иметь нетипированные экземпляр эталонного класса, так что последний используется реже.

Ответил 18/09/2008 в 12:10
источник пользователем

голоса
1

И для полноты картины , Эрик Липперт имеет блог о различии и некоторых оговорках.

Ответил 09/10/2009 в 01:04
источник пользователем

голоса
1

Для тех из вас VB.NET опыта, (типа) такая же, как и DirectCast «как тип» так же, как TryCast.

Ответил 16/09/2008 в 22:55
источник пользователем

голоса
1

Это как разница между синтаксическим анализом и TryParse. Вы можете использовать TryParse, когда вы ожидаете, что может потерпеть неудачу, но если у вас есть сильная уверенность, что не удастся использовать Разбор.

Ответил 08/08/2008 в 13:00
источник пользователем

голоса
1

Они будут бросать различные исключения.
(): NullReferenceException
как: InvalidCastException
которые могли бы помочь при отладке.

В «как» ключевое слово попытки бросить объект и если бросок терпит неудачу, нуль возвращается тихо. ) Оператор приведения (будет сгенерировано исключение немедленно, если бросок терпит неудачу.

«Использовать только C #„ как“ключевое слово, где вы ожидаете бросок к сбою в не исключительный случай. Если вы рассчитываете на гипсе, чтобы добиться успеха и не готовы получить какой-либо объект, который потерпит неудачу, вы должны использовать () отливать оператор, так что это уместно и полезно исключение «.

Примеры кода и дальнейшее объяснение: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

Ответил 05/08/2008 в 16:49
источник пользователем

голоса
1

Заключенный в скобки бросок бросает исключение, если попытка броска терпит неудачу. «Как» слепок возвращает нулевое значение, если попытка броска терпит неудачу.

Ответил 05/08/2008 в 16:45
источник пользователем

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