2010-01-20 4 views
57

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

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

Возможный дубликат [Casting vs Преобразование объекта toString, когда объект действительно является строкой] (http://stackoverflow.com/questions/1170756/casting-vs-converting-an-object-tostring-when-object- true-is-a-string) –

ответ

82

Если Session ["SessionTheme"] не является строкой, то «как строка» возвращает null.

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

object o1 = "somestring"; 
object o2 = 1; 

string s = o1 as string; // returns "somestring" 
string s = o2 as string; // returns null 
string s = o2.ToString(); // returns "1" 

Еще одна важная вещь, чтобы иметь в виду, что если объект имеет нулевое значение, вызывая .ToString() сгенерирует исключение, но «как строка» будет просто возвращать нуль.

+2

'ToString()' будет 'пытаться преобразовать любой другой тип в строку'? Да, с большинством встроенных типов. С вашим собственным пользовательским материалом в сеансе, скажем, сложным объектом User, все зависит от того, переопределили ли вы ToString() и как вы его реализовали в своем классе. Если он не реализован, он возвращает строку информации типа. –

+1

Да, конечно. Но здесь нужно проиллюстрировать разницу между ToString() и «как строка». Если я хочу предоставить полный ответ, это будет 2 страницы длиной –

+3

Мой комментарий объясняет это. Это не 2 страницы. Речь идет о том, чтобы быть точным *. –

1

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

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

+1

Он не пытается бросить. Он проверяет, является ли класс экземпляром указанного типа и возвращает ссылку, если так, иначе null. –

+0

@Wim Hollebrandse - спасибо за исправление. – Oded

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

пытается бросить в строку

тогда

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

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

1

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

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

12

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

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

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

0

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

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

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

+2

почти наверняка? – stuartdotnet

4

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

string str = any-object as string; 

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

string str = any-object.ToString(); 

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

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

3

Чтобы путать дело, C# 6.0 представила null-conditional operator. Так что теперь это можно записать в виде:

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

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

+0

Хотя это полезно, не уверен, как он напрямую отвечает на вопрос о различии между 'as string' и' .ToString() '. – crashmstr

 Смежные вопросы

  • Нет связанных вопросов^_^