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