Це дійсно залежить від того, чи знаєте ви, що 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
метод може зробити те, що вам потрібно.