Dav*_*jak 70 c# string parsing casting
这不是一个真正的问题,但我很好奇.当我将一个字符串保存在一个DataRow中时,它会被转换为Object.当我想使用它时,我必须将其转换为ToString.据我所知,有几种方法可以做到这一点,首先是
string name = (string)DataRowObject["name"]; //valid since I know it's a string
Run Code Online (Sandbox Code Playgroud)
另一个是:
string name = DataRowObject["name"].ToString();
Run Code Online (Sandbox Code Playgroud)
我感兴趣的是两者有什么区别?第一个更有效率吗?(这只是一个推测,在我的脑海中ToString()方法是通过一些循环机制实现的,只是把它"变得"更快,但这只是一种"直觉"我有).
有没有更快/更优雅的方式这样做?
任何人都可以为我清除这个吗?
Adr*_*der 51
这两个用于不同的目的.任何对象的ToString方法都应该返回该对象的字符串表示.如上所述,转换是完全不同的,'as'关键字执行条件转换.'as'关键字基本上表示"如果该对象是这种类型,请将此类型的引用提供给该对象",而ToString则说"给我一个该对象的字符串表示".结果在某些情况下可能是相同的,但两者绝不应该被认为是可以互换的,因为正如我所说,它们存在于不同的目的.如果您的意图是强制转换,则应始终使用强制转换,而不是ToString.
来自http://www.codeguru.com/forum/showthread.php?t=443873
另见http://bytes.com/groups/net-c/225365-tostring-string-cast
And*_*are 30
如果你知道它是一个String然后通过一切手段把它投入到String.转换对象比调用虚方法要快.
编辑:以下是一些基准测试的结果:
============ Casting vs. virtual method ============
cast 29.884 1.00
tos 33.734 1.13
Run Code Online (Sandbox Code Playgroud)
我用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();
}
}
Run Code Online (Sandbox Code Playgroud)
因此看起来铸造实际上比调用稍快ToString().
Dzm*_*uba 16
基本上在你的情况下,最好保留类型转换,因为.ToString()可能会隐藏错误.例如,您的数据库架构已更改且名称不再是字符串类型,但使用.ToString()您的代码仍然有效.所以在这种情况下最好使用类型转换.
这是String.ToString()的实现 - 没什么特别的=)
public override string ToString()
{
return this;
}
Run Code Online (Sandbox Code Playgroud)
由于CLR必须执行各种运行时类型检查,因此向下转换是相对较慢的操作.然而,在此特定情形铸造string比调用更合适ToString()的一致性的缘故(你不能叫ToInt32上object,而是投它int)和maintanability.
小智 5
我想再发表一则评论
如果要使用强制转换: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";
}
Run Code Online (Sandbox Code Playgroud)