Разница между методами литья/преобразования в С#

Есть много способов, чтобы отличить/преобразовать объект в другой, какова разница между ними, и если нет никакой разницы, почему существует так много способов добиться чего-то одного? Разве это не ущерб языку?

Пусть объект obj соответствует строке.

obj.ToString()
obj as string
(string)obj
Convert.ToString(obj)

Ответ 1

Здесь вы делаете разные вещи:

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

Есть много разных способов получить string из object, потому что каждый из них отличается и имеет тонкие отличия. Да, во многих случаях возвращаемая строка будет одинаковой, но это не гарантируется.

Ответ 2

obj as string
(string)obj

"как" оператор безопасен. если он не может преобразовать его, возвращает null, когда оператор() вызывает исключение

Ответ 3

Есть разница:

  • ToString - это метод, который полагается на то, что сам объект определяет, как будет выглядеть представление строки.
  • as ключевое слово - это преобразование ссылок: Note that the as operator only performs reference conversions and boxing conversions.
  • Использование() для указания типа - это явное преобразование, тогда как ключевое слово as неявный.
  • Использование Convert -класс фактически просто помогает вам разобрать его, Convert.ToString, вероятно, просто обертывает .ToString() на объект.

Ответ 4

Существует несколько способов сделать в основном одно и то же, но с небольшими вариациями. Существует отличная разница между кастингом и преобразованием, где вы, например, можете преобразовать int в string, но вы не можете отбрасывать int до string.

У вас есть правильная точка в том, что это вредно для языка, но не в основном потому, что существует много способов делать что-то, а потому, что они могут быть непоследовательно реализованы. Когда вы реализуете классы, вы должны быть осторожны, чтобы вести себя так, как ожидалось. Проверка равенства - один из примеров, где вы можете использовать метод или оператор:

x == y
x.Equals(y)

Если вы реализуете один из них в своем классе, а не другой, компилятор помогает вам с предупреждением о том, что оба должны быть реализованы для правильного поведения класса.

Ответ 5

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

Есть две операции литья по той причине, о которой объяснил Арсений: Оператор as вернет нулевую ссылку, тогда как оператор () вызовет исключение, если трансляция невозможна.

Существует два метода ToString, поскольку obj.ToString(), конечно, работает только в том случае, если obj - действительно объект, а не, например, int. Для более позднего случая вы должны использовать Convert.ToString(). Точно так же, когда obj равно null, тогда obj.ToString() вызовет исключение, тогда как Convert.ToString() может вернуть некоторую разумную строку (например, "null").

Ответ 6

что [есть] разница между этими

В библиотеке существует 2 способа ввода типов и ряд классов и методов. Typecasting используется для объектов (значений), которые уже технически близки и сильно связаны.

Преобразование (методы Convert и SomeType.Parse()) действительно преобразуют типы данных (String to Int32 не может быть отличным).

почему существует так много способов достичь одна вещь?

Кастинг и преобразование важны, часто используются действия. Вот почему у нас есть мелкозернистый набор инструментов, правда, с довольно небольшим перекрытием.