这不是一个真正的问题,但我很好奇。当我将一个字符串保存在一个DataRow中时,它会被转换为Object。当我想使用它时,我必须将其转换为ToString。据我所知,有几种方法可以做到这一点,首先是
string name = (string)DataRowObject["name"]; //valid since I know it's a string
另一个是:
string name = DataRowObject["name"].ToString();
我感兴趣的是两者有什么区别?第一个更有效率吗? (这只是一个推测,在我的脑海中ToString()方法是通过一些循环机制实现的,只是把它“加速”可能会更快,但这只是我的“直觉”。
还有更快/更优雅的方式吗?
任何人都可以为我解决这个问题吗?
答案 0 :(得分:50)
这两个是针对不同的 目的。任何ToString方法 object应该返回一个字符串 该对象的表示。铸件 是非常不同的,'as'键 单词执行条件转换,如 有人说过。 'as'关键词 基本上说“给我一个参考 这种类型的那个类型 对象就是这种类型“而ToString 说“给我一个字符串代表 该对象的结果“。结果可能是 在某些情况下相同,但两者应该 永远不会被认为可以互换 因为,正如我所说,他们存在 不同的目的。如果你的意图 是施放然后你应该总是使用 演员,不是ToString。
答案 1 :(得分:30)
如果您知道它是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()
更快。
答案 2 :(得分:16)
基本上在你的情况下,最好保留类型转换,因为.ToString()可能会隐藏错误。例如,您的数据库架构已更改且名称不再是字符串类型,但使用.ToString()您的代码仍然有效。所以在这种情况下最好使用类型转换。
这是String.ToString()的实现 - 没什么特别的=)
public override string ToString()
{
return this;
}
答案 3 :(得分:5)
由于CLR必须执行各种运行时类型检查,因此向下转换是一个相对较慢的操作。但是,在此特定情况下,为了保持一致性,转换为string
比调用ToString()
更合适(您无法在ToInt32
上调用object
,而是将其转换为int
{{1}})和maintanability。
答案 4 :(得分:4)
我想再发表一条评论
如果你打算使用cast:string name =(string)DataRowObject [“name”] 你将得到一个异常:如果数据库表中的记录具有空值,则无法将'System.DBNull'类型的对象强制转换为类型'System.String'。
在这种情况下,您必须使用:string name = DataRowObject [“name”]。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";
}
答案 5 :(得分:3)
对于数据对象,我建议您使用“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.
}
答案 6 :(得分:2)
在这种情况下:
string name = DataRowObject["name"].ToString();
因为它是string
,我认为字符串对象的ToString()
方法很简单:
return this;
所以恕我直言,没有性能损失。
PS 我是一名Java程序员,所以这只是一个猜测。
答案 7 :(得分:1)
默认情况下,ToString()不执行强制转换。其目的是返回表示类型的字符串(例如“System.Object”)。
如果你想避免强制转换,你可以尝试考虑强类型的实现(例如使用泛型)并完全避免使用DataRowObject。
答案 8 :(得分:1)
我知道你提到Object是一个字符串,但是你担心返回的对象为null,你也可以使用“Convert.ToString(DataRowObject [”name“]);”如果对象为null,则返回空字符串(string.empty)有额外的好处,以避免任何空引用异常(除非你想要在这种情况下抛出异常)。