有很多方法可以将一个对象转换为另一个对象,那么这些方法之间的区别是什么?如果没有区别,为什么会有这么多种实现方式来达到同一目的?这不会损害语言吗?
比如说,将对象 obj 转换为字符串。
obj.ToString()
obj as string
(string)obj
Convert.ToString(obj)
有很多方法可以将一个对象转换为另一个对象,那么这些方法之间的区别是什么?如果没有区别,为什么会有这么多种实现方式来达到同一目的?这不会损害语言吗?
比如说,将对象 obj 转换为字符串。
obj.ToString()
obj as string
(string)obj
Convert.ToString(obj)
在这里你正在做不同的事情:
obj.ToString()
- 这是调用对象的ToString()
方法。该对象会返回一个程序编写的字符串。obj as string
- 这是尝试将对象转换为字符串,可能会成功也可能失败(如果失败,则结果为null
),不会引发异常。(string)obj
- 这是将obj
显式转换为类型string
,您告诉编译器obj
确实是一个string
类型。如果obj
不是字符串类型,则会出现转换异常。Convert.ToString(obj)
- 这是显式调用Convert类返回obj
的字符串表示形式。有这么多不同的方式可以从一个object
获取string
,因为每个方法都是不同的并且具有微妙的差异。是的,在许多情况下,返回的字符串将是相同的,但这并不被保证。
object
。由于它上面定义了ToString()
方法,因此所有对象都有一个ToString()
方法,可以被重写。据我所知,Convert.ToString(obj)
只是调用了它,但本质上,你所说的是正确的 - Convert
尽最大努力从“对象”中“创建”一个字符串。 - Odedobj as string
(string)obj
“as”运算符是安全的。如果无法转换,它会返回null,而“()”运算符会引发异常。
"int
转换为string
,但不能将int
强制类型转换为string
。x == y
x.Equals(y)
首先,类型转换(casting)与将对象转换为字符串非常不同。类型转换并不会将对象转换成任何东西,它只是假定另一种类型,而ToString方法则真正从对象中创建一个字符串(如果对象已经是字符串,则可能不执行任何操作)。
有两个类型转换操作,原因就像Arseny解释的那样:as运算符将返回null引用,而()运算符将在无法进行转换时引发异常。
有两个ToString方法,obj.ToString()当然仅适用于obj确实是对象而不是例如int的情况。对于后一种情况,您必须使用Convert.ToString()。同样,当obj为null时,obj.ToString()将引发异常,而Convert.ToString()可以返回一些有意义的字符串(例如“null”)。
Convert
类和SomeType.Parse()
方法)实际上是将数据类型进行转换(例如,String转换为Int32不能是类型转换)。