Разница между .ToString и «как строка» в C # - PullRequest
62 голосов
/ 20 января 2010

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

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

Ответы [ 8 ]

93 голосов
/ 20 января 2010

Если 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.

13 голосов
/ 20 января 2010

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

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

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

5 голосов
/ 20 января 2010
Page.Theme = Session["SessionTheme"] as string;

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

, тогда как

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

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

4 голосов
/ 20 января 2010

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

string str = any-object as string;

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

string str = any-object.ToString();  

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

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

3 голосов
/ 15 сентября 2015

Чтобы еще больше запутать ситуацию, в C # 6.0 введен нулевой условный оператор .Так что теперь это также можно записать в виде:

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

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

1 голос
/ 20 января 2010

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

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

1 голос
/ 20 января 2010

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

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

0 голосов
/ 20 января 2010

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

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

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

...