Разница между .ToString и "как строка" в С#

В чем разница между использованием двух следующих утверждений? Мне кажется, что первая "как строка" относится к типу, тогда как вторая ToString является фактическим вызовом метода, который преобразует вход в строку? Просто ищите какое-то понимание, если оно есть.

Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();

Ответ 1

Если Session["SessionTheme"] не является string, as string вернет null.

.ToString() попытается преобразовать любой другой тип в строку, вызвав метод объекта ToString(). Для большинства встроенных типов это будет возвращать объект, преобразованный в строку, но для пользовательских типов без специального метода .ToString(), он будет возвращать имя типа объекта.

object o1 = "somestring";
object o2 = 1;
object o3 = new object();
object o4 = null;

string s = o1 as string;  // returns "somestring"
string s = o1.ToString(); // returns "somestring"
string s = o2 as string;  // returns null
string s = o2.ToString(); // returns "1"
string s = o3 as string;  // returns null
string s = o3.ToString(); // returns "System.Object"
string s = o4 as string;  // returns null
string s = o4.ToString(); // throws NullReferenceException

Еще одна важная вещь, о которой следует помнить, это то, что если объектом является null, вызов .ToString() вызовет исключение, но as string просто вернет null.

Ответ 2

Ключевое слово as будет в основном проверять, является ли объект is экземпляром типа, используя код операции MSIL isinst под капотом. Если это так, он возвращает ссылку на объект, иначе нулевую ссылку.

Он, как многие говорят, не пытается выполнить трансляцию как таковую, что подразумевает какую-то обработку исключений. Не так.

ToString() просто вызывает метод object ToString(), либо настраиваемый, реализованный классом (который для большинства встроенных типов выполняет преобразование в строку) - или если ни один не предоставлен, базовый класс object один, возвращающий тип информации.

Ответ 3

Page.Theme = Session["SessionTheme"] as string;

пытается передать строку

тогда

Page.Theme = Session["SessionTheme"].ToString;

вызывает метод tostring, который может быть чем-то действительно. Этот метод не использует, он должен возвращать строковое представление этого объекта.

Ответ 4

Прежде всего " любой объект как строка" и " any-object.ToString()" - это совершенно разные вещи с точки зрения их соответствующего контекста.

string str = any-object as string;

1) Это приведет к тому, что любой объект будет выглядеть как строковый тип, и если какой-либо объект не будет сбрасываться в строку, тогда этот оператор вернет значение null, не выбрасывая исключение.  2) Это компилятор-служба.
 3) Это работает очень хорошо для любого другого типа, кроме строки, например: вы можете сделать это как любой объект как Employee, где Employee - это класс, определенный в вашей библиотеке.

string str = any-object.ToString();  

1) Это вызовет ToString() любого объекта из защиты типа. Поскольку System.Object определяет метод ToString(), любой класс в .NET-инфраструктуре имеет метод ToString(), доступный для переустановки. Программист переопределит ToString() в классе объектов или структурировании и напишет код, который возвращает подходящее строковое представление любого объекта в соответствии с ответственностью и ролью, которую играет какой-либо объект.
 2) Подобно тому, как вы можете определить метод Employee и Over-ride ToString(), который может возвращать представление строки объекта Employee как "FIRSTNAME - LASTNAME, EMP-CDOE".

Обратите внимание, что в этом случае у программиста есть контроль над ToString(), и он не имеет никакого отношения к кастингу или преобразованию типов.

Ответ 5

Чтобы смутить вопрос, С# 6.0 ввел оператор с нулевым условием. Итак, теперь это также можно записать как:

Page.Theme = Session["SessionTheme"]?.ToString();

который вернет либо null, либо результат из ToString(), не вызывая исключения.

Ответ 6

Я расширяю, что Филипп Лейберт немного согласился с ответом, потому что, хотя я нашел ресурсы, сравнивающие три из них, я так и не нашел объяснения, сравнивающего все четыре.

  • (string)obj
  • obj as string
  • obj.ToString()
  • Convert.ToString(obj)
object o1 = "somestring";
object o2 = 1;
object o3 = new object();
object o4 = null;

Console.WriteLine((string)o1);           // returns "somestring"
Console.WriteLine(o1 as string);         // returns "somestring"
Console.WriteLine(o1.ToString());        // returns "somestring"
Console.WriteLine(Convert.ToString(o1)); // returns "somestring"
Console.WriteLine((string)o2);           // throws System.InvalidCastException
Console.WriteLine(o2 as string);         // returns null
Console.WriteLine(o2.ToString());        // returns "1"
Console.WriteLine(Convert.ToString(o2)); // returns "1"
Console.WriteLine((string)o3);           // throws System.InvalidCastException
Console.WriteLine(o3 as string);         // returns null
Console.WriteLine(o3.ToString());        // returns "System.Object"
Console.WriteLine(Convert.ToString(o3)); // returns "System.Object"
Console.WriteLine((string)o4);           // returns null
Console.WriteLine(o4 as string);         // returns null
Console.WriteLine(o4.ToString());        // throws System.NullReferenceException
Console.WriteLine(Convert.ToString(o4)); // returns ""

Из этих результатов видно, что (string)obj и obj as string ведут себя одинаково, когда obj является строкой или нулем; в противном случае (string)obj сгенерирует недопустимое исключение приведения, а obj as string просто вернет ноль. obj.ToString() и Convert.ToString(obj) также ведут себя так же, как и другие, за исключением случаев, когда obj имеет значение null, и в этом случае obj.ToString() сгенерирует исключение нулевой ссылки, а Convert.ToString(obj) вернет пустую строку.

Итак, вот мои рекомендации:

  • (string)obj работает лучше всего, если вы хотите генерировать исключения для типов, которые не могут быть назначены строковой переменной (которая включает ноль)
  • obj as string работает лучше всего, если вы не хотите генерировать какие-либо исключения, а также не хотите, чтобы строковые представления были не строковыми
  • obj.ToString() работает лучше всего, если вы хотите выбросить исключения для нуля
  • Convert.ToString(obj) работает лучше всего, если вы не хотите генерировать какие-либо исключения и хотите, чтобы строковые представления были не строковыми

Ответ 7

Проверка as string - это объект, который является строкой. Если он не является нулевым, он возвращается.

Вызов ToString() действительно вызовет метод ToString() для объекта.

Ответ 8

Первый возвращает класс как строку, если класс является строкой или получен из строки (возвращает null, если не удалось).

Второй вызывает метод ToString() для класса.

Ответ 9

На самом деле лучшим способом написания вышеприведенного кода является выполнение следующих действий:

if (Session["SessionTheme"] != null)
{
    Page.Theme = Session["SessionTheme"].ToString();
}

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