Это действительно зависит от того, знаете ли вы o
строку и что вы хотите с ней делать. Если ваш комментарий означает, что на o
самом деле это строка, я бы предпочел прямой(string)o
акт - вряд ли она потерпит неудачу.
Самым большим преимуществом использования прямого приведения является то, что при сбое вы получаете InvalidCastException , который в значительной степени сообщает вам, что пошло не так.
С as
оператором, если o
это не строка, s
устанавливается значение null
, что удобно, если вы не уверены и хотите проверить s
:
string s = o as string;
if ( s == null )
{
// well that's not good!
gotoPlanB();
}
Однако, если вы не выполните этот тест, вы будете использовать его s
позже и получите исключение NullReferenceException . Они, как правило, встречаются чаще, и их гораздо сложнее отследить, когда они происходят в дикой природе, поскольку почти каждая строка разыменовывает переменную и может ее выбросить. С другой стороны, если вы пытаетесь привести к типу значения (любому примитиву или структурам, таким как DateTime ), вы должны использовать прямое приведение -as
не сработает.
В особом случае преобразования в строку каждый объект имеет ToString
, поэтому ваш третий метод может быть в порядке, если o
он не равен нулю, и вы думаете, что ToString
метод может делать то, что вы хотите.