C#中转换方法和类型转换方法的区别

11

有很多方法可以将一个对象转换为另一个对象,那么这些方法之间的区别是什么?如果没有区别,为什么会有这么多种实现方式来达到同一目的?这不会损害语言吗?

比如说,将对象 obj 转换为字符串。

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

1
能够用多种方式创造事物并不是一种损失,而是一种强大的资源。就像在口语中一样:你可以用各种方式表达自己(这些方式可能存在微小的差异)。 - Tuomas Hietanen
6个回答

17

在这里你正在做不同的事情:

  • obj.ToString() - 这是调用对象的ToString()方法。该对象会返回一个程序编写的字符串。
  • obj as string - 这是尝试将对象转换为字符串,可能会成功也可能失败(如果失败,则结果为null),不会引发异常。
  • (string)obj - 这是将obj显式转换为类型string,您告诉编译器obj确实是一个string类型。如果obj不是字符串类型,则会出现转换异常。
  • Convert.ToString(obj) - 这是显式调用Convert类返回obj的字符串表示形式。

有这么多不同的方式可以从一个object获取string,因为每个方法都是不同的并且具有微妙的差异。是的,在许多情况下,返回的字符串将是相同的,但这并不被保证。


那么,如果不存在,是否仍然要使用“creates” .ToString()类型? - eugeneK
@eugeneK - 在.NET中,所有对象都继承自object。由于它上面定义了ToString()方法,因此所有对象都有一个ToString()方法,可以被重写。据我所知,Convert.ToString(obj)只是调用了它,但本质上,你所说的是正确的 - Convert尽最大努力从“对象”中“创建”一个字符串。 - Oded
1
@eugeneK,Convert.ToString使用IConvertible接口来确定如何执行转换。这可能具有不同于.ToString()的实现,尽管它们通常是相同的。还可以查找类的TypeConverter并将其转换为字符串(如果转换器支持),这是设计器在属性网格中将实例表示为字符串时使用的机制。 - Dan Bryant

2
obj as string
(string)obj

"

“as”运算符是安全的。如果无法转换,它会返回null,而“()”运算符会引发异常。

"

那么为什么()存在呢?在“正确”的编程中,最好在异常发生之前处理它们。我们可以询问obj作为字符串的结果值是否为null并处理“异常”。 - eugeneK
@eugeneK "AS"运算符仅适用于引用类型。您不能像这样执行它 int r = stmng as int; 要请求所需的类型 您可以调用此if(obj IS string) - Arseny
@eugeneK,显式转换(而不是'as')包括断言您相信转换将成功。当您相信这种情况时,如果转换失败,抛出异常是有意义的。基本上,当您无法有意义地处理转换失败时,才会显式转换。 - Dan Bryant

2

这里有一个区别:

  • ToString是一种方法,它依赖于对象本身定义字符串表示形式的方式。
  • as关键字是引用转换:请注意,as运算符仅执行引用转换和装箱转换。
  • 使用()指定类型是显式转换,而as关键字是隐式转换
  • 使用Convert-类实际上只是帮助您解析它,Convert.ToString可能只是在对象上包装.ToString()。

参考和装箱转换是什么?(三个词) - eugeneK
@eugeneK,我不知道你说的三个词是什么意思,但是你可以查看MSDN上关于装箱/拆箱的相关内容:http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx - Filip Ekberg

2
通常情况下,同一件事情可以有多种方式实现,但可能存在细微差别。转换和强制类型转换有着明显的区别,例如你可以将一个int转换为string,但不能将int强制类型转换为string
您提出了一个有效的观点,即这是否会对语言造成伤害,但主要原因不是因为有很多方法可以做事情,而是因为它们可能被不一致地实现。当您实现类时,必须小心,以确保它们表现如预期。检查相等性就是一个例子,您可以使用方法或运算符来实现。
x == y
x.Equals(y)

如果您在类中实现其中一个而不是另一个,则编译器会使用警告来帮助您,说明为了使类的行为正常,两个都必须实现。

1

首先,类型转换(casting)与将对象转换为字符串非常不同。类型转换并不会将对象转换成任何东西,它只是假定另一种类型,而ToString方法则真正从对象中创建一个字符串(如果对象已经是字符串,则可能不执行任何操作)。

有两个类型转换操作,原因就像Arseny解释的那样:as运算符将返回null引用,而()运算符将在无法进行转换时引发异常。

有两个ToString方法,obj.ToString()当然仅适用于obj确实是对象而不是例如int的情况。对于后一种情况,您必须使用Convert.ToString()。同样,当obj为null时,obj.ToString()将引发异常,而Convert.ToString()可以返回一些有意义的字符串(例如“null”)。


1
这是关于编程的内容。有两种类型转换方式和一系列库中的类和方法。类型转换用于已经在技术上接近且强相关的对象(值)。
转换(使用Convert类和SomeType.Parse()方法)实际上是将数据类型进行转换(例如,String转换为Int32不能是类型转换)。
“为什么有这么多实现同一个功能的方式?”类型转换和转换是重要且频繁使用的操作。这就是为什么我们拥有一个细粒度的工具集,尽管存在相当大的重叠。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接