Разница между методами литья/преобразования в С#
Есть много способов, чтобы отличить/преобразовать объект в другой, какова разница между ними, и если нет никакой разницы, почему существует так много способов добиться чего-то одного? Разве это не ущерб языку?
Пусть объект 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 не может быть отличным).
почему существует так много способов достичь одна вещь?
Кастинг и преобразование важны, часто используются действия. Вот почему у нас есть мелкозернистый набор инструментов, правда, с довольно небольшим перекрытием.