Это действительно зависит от того, знаете ли вы, 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
может делать то, что вы хотите.