这不是一个真正的问题,但我很好奇.当我将一个字符串保存在一个DataRow中时,它会被转换为Object.当我想使用它时,我必须将其转换为ToString.据我所知,有几种方法可以做到这一点,首先是
string name = (string)DataRowObject["name"]; //valid since I know it's a string
另一个是:
string name = DataRowObject["name"].ToString();
我感兴趣的是两者有什么区别?第一个更有效率吗?(这只是一个推测,在我的脑海中ToString()方法是通过一些循环机制实现的,只是把它"变得"更快,但这只是一种"直觉"我有).
有没有更快/更优雅的方式这样做?
任何人都可以为我清除这个吗?
这两个用于不同的目的.任何对象的ToString方法都应该返回该对象的字符串表示.如上所述,转换是完全不同的,'as'关键字执行条件转换.'as'关键字基本上表示"如果该对象是这种类型,请将此类型的引用提供给该对象",而ToString则说"给我一个该对象的字符串表示".结果在某些情况下可能是相同的,但两者绝不应该被认为是可以互换的,因为正如我所说,它们存在于不同的目的.如果您的意图是强制转换,则应始终使用强制转换,而不是ToString.
来自http://www.codeguru.com/forum/showthread.php?t=443873
另见http://bytes.com/groups/net-c/225365-tostring-string-cast
如果你知道它是一个String
然后通过一切手段把它投入到String
.转换对象比调用虚方法要快.
编辑:以下是一些基准测试的结果:
============ 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()
.
基本上在你的情况下,最好保留类型转换,因为.ToString()可能会隐藏错误.例如,您的数据库架构已更改且名称不再是字符串类型,但使用.ToString()您的代码仍然有效.所以在这种情况下最好使用类型转换.
这是String.ToString()的实现 - 没什么特别的=)
public override string ToString() { return this; }
由于CLR必须执行各种运行时类型检查,因此向下转换是相对较慢的操作.然而,在此特定情形铸造string
比调用更合适ToString()
的一致性的缘故(你不能叫ToInt32
上object
,而是投它int
)和maintanability.
我想再发表一则评论
如果要使用强制转换:string name =(string)DataRowObject [“ name”],则将发生异常:如果记录中包含'System.DBNull'类型的对象,则无法将该类型转换为'System.String'。数据库表的值为空。
在这种情况下,您必须使用:字符串名称= DataRowObject [“名称”] .ToString()或
您必须检查空值,例如
if(!string.IsNullOrEmpty(DataRowObject["name"].ToString())) { string name = (string)DataRowObject["name"]; } else { //i.e Write error to the log file string error = "The database table has a null value"; }