铸造VS转换对象toString,当对象真的是一个string

这不是一个真正的问题,但我很好奇。 当我保存一个string让我们说一个DataRow,它被转换为对象。 当我想使用它时,我必须将其转换为ToString。 据我所知有几种方法做到这一点,首先是

string name = (string)DataRowObject["name"]; //valid since I know it's a string 

另一个是:

 string name = DataRowObject["name"].ToString(); 

我感兴趣两者之间有什么区别? 第一个更有效率? (这只是一个猜测,在我头上的ToString()方法是通过一些循环机制来实现的,在这种循环机制中,只需要将其转换为“可以”更快,但是这只是我的“直觉”)。

有没有更快/更优雅的方式呢?

任何人都可以为我清除这个?

这两个是用于不同的目的。 任何对象的ToString方法应该返回该对象的string表示forms。 如上所述,投射是非常不同的,而'as'关键词则进行有条件的投射。 “as”关键词基本上是这样说的:“如果该对象是这种types的话,让我把这个types引用到该对象”,而ToString则说“给我一个该对象的string表示forms”。 结果可能在某些情况下是相同的,但是这两者不应该被认为是可以互换的,因为正如我所说的,它们是为了不同的目的而存在的。 如果你的意图是施放,那么你应该总是使用一个强制转换,而不是ToString。

来自http://www.codeguru.com/forum/showthread.php?t=443873

另见http://bytes.com/groups/net-c/225365-tostring-string-cast

如果你知道这是一个String然后通过一切手段将其转换为一个String 。 铸造你的对象将比调用虚拟方法更快。

编辑:这是一些基准testing的结果:

 ============ Casting vs. virtual method ============ cast 29.884 1.00 tos 33.734 1.13 

我用这个Jon Skeet的BenchmarkHelper

 using System; using BenchmarkHelper; class Program { static void Main() { Object input = "Foo"; String output = "Foo"; var results = TestSuite.Create("Casting vs. virtual method", input, output) .Add(cast) .Add(tos) .RunTests() .ScaleByBest(ScalingMode.VaryDuration); results.Display(ResultColumns.NameAndDuration | ResultColumns.Score, results.FindBest()); } static String cast(Object o) { return (String)o; } static String tos(Object o) { return o.ToString(); } } 

所以它看起来实际上比调用ToString() 稍微快一点。

基本上在你的情况下最好离开types转换,因为.ToString()可能隐藏错误。 例如,您的数据库模式已更改,名称不再是stringtypes,而是使用.ToString(),您的代码仍然有效。 所以在这种情况下最好使用types转换。

这里是String.ToString()的实现 – 没有什么特别的=)

 public override string ToString() { return this; } 

Downcasting是一个相对较慢的操作,因为CLR必须执行各种运行时types检查。 然而,在这种特殊情况下,为了一致性(不能在object上调用ToInt32 ,而是将其强制转换为int )和维护性,转换为string比调用ToString()更合适。

我想再作一点评论

如果你打算使用cast:string name =(string)DataRowObject [“name”],你会得到一个exception:无法强制转换types为“System.DBNull”的对象来input“System.String”数据库表有空值。

在这种情况下,你必须使用:string name = DataRowObject [“name”]。ToString()或者

你必须检查空值如

 if(!string.IsNullOrEmpty(DataRowObject["name"].ToString())) { string name = (string)DataRowObject["name"]; } else { //ie Write error to the log file string error = "The database table has a null value"; } 

在这种情况下:

 string name = DataRowObject["name"].ToString(); 

因为它是一个string ,我认为string对象的ToString()方法很简单:

 return this; 

所以恕我直言,没有性能损失。

PS我是一个Java程序员,所以这只是一个猜测。

对于数据对象,我build议您使用“as”关键字,如下面的代码。

 string name = DataRowObject["name"] as string; 

在使用价值之前请检查它。

 if(name != null) { // statement for empty string or it has value } else { // statement for no data in this object. } 

ToString()默认不执行强制转换。 其目的是返回一个表示types的string(例如“System.Object”)。

如果你想避免强制转换,你可以试着想一个强types的实现(比如使用generics),并且完全避免使用DataRowObject。

我知道你提到Object是一个string,但是如果你害怕返回的对象是null,你也可以使用“Convert.ToString(DataRowObject [”name“]);” 如果对象为空,这样可以返回一个空string(string.empty),避免任何空引用exception(当然,除非你想在这种情况下引发exception)。