(string)reader[0]和reader[0].ToString()之间的区别

3
有没有DataReader[0].ToString()(string)DataReader[0]之间的差异?
我猜(string)DataReader[0]可能会失败,如果数据库类型不是字符串类型,那么DataReader[0].ToString()只会将任何非DB null内容转换为字符串。是这种情况吗?
哪个更快?

1
作为一点乐趣,我会添加 Convert.ToString(DataReader[0]); :-) - Steven Ryssaert
1
“would just convert anything outside of a DB null to a string” 实际上,DBNull.Value 有一个 ToString(),因为它是一个实际的对象,所以您可以调用 ToString() 来使用它,并且它将正常工作。 - BoltClock
但是,如果数据库中的 DataReader[0] 为 null,则我的意思是 ToString() 会抛出异常。 - Tim Coker
3个回答

2

这两种方法都可以引入潜在的数据异常,我认为从读取器中读取数据的最佳方式是:

var x = reader[0] as string

对于数字/布尔等类型,我总是使用可空类型,以便您可以获得

var y = reader[1] as int?

现在,如果您绝对不想使用可空类型(我认为它们非常适合知道某些东西是否设置),则可以使用以下代码:

int i = (reader[1] as int?).GetValueOrDefault()


7
如果你期望一个字符串值,但最终得到的是(比方说)一个整数,我宁愿看到抛出异常,而不是像真正收到null值一样继续执行。 - Jon Skeet
1
如果你调用 ToString() 的对象为 null,它将抛出一个空引用异常。除此之外,每次它都会返回一些东西。(除非你在自定义对象的 ToString() 上搞砸了重写) - Tim Coker
2
@Chris:相较于用空数据覆盖某人的银行账户,我宁愿有一个空白页面。如果有问题,请尽快中止程序。继续使用错误数据是一个非常糟糕的想法。 - Jon Skeet
2
@Chris:嗯,null可能是数据的有效值,但由于模式问题,它并不是实际存储在数据库中的值。为什么要忽略模式不匹配的情况呢?从根本上讲,我们可以轻松地在这个点上发现错误——为什么要推迟错误处理,并冒着后来可能无法发现问题的风险呢?再次强调,在大多数情况下,一旦发现有严重问题,立即失败是最好的方法。 - Jon Skeet
1
@Chris:我个人宁愿告诉别人系统出了问题,也不愿意呈现一个明显错误但却被我(作为系统)声称是正确的报告。将错误数据呈现为正确的样子看起来很糟糕,在我看来...而且如果错误并不明显,而是相当微妙的话,这样做还可能延迟错误的发现。 - Jon Skeet
显示剩余14条评论

0

(string)DataReader[0] 是类型转换。编译器将在编译时插入一些需要执行的指令以执行转换,并在无法执行转换时抛出异常。

DataReader[0].tostring() 是运行时解析的函数调用,不会抛出异常。

专家们请纠正我如果我错了。


0

虽然已经晚了,但我认为很多人对于(string)object和object.ToString()有相似的疑惑,这个问题是一个适合讨论的地方。

如果确定对象的类型是字符串,则最好进行类型转换而不是调用方法.ToString()。如果您查看ToString()的代码:

    public virtual string ToString()
    {
      return this.GetType().ToString();
    }

首先通过调用GetType()方法找到对象的类型,然后调用该类型的ToString()方法。

如果我们不确定object的类型,则答案应该是执行ToString()而不是(string)

如果您想查看(string)与.ToString()性能基准的比较,请访问链接:(string) vs .ToString()


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