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

Posted

技术标签:

【中文标题】(string)reader[0] 和 reader[0].ToString() 之间的区别【英文标题】:Difference between (string)reader[0] and reader[0].ToString() 【发布时间】:2011-05-12 13:08:18 【问题描述】:

DataReader[0].ToString()(string)DataReader[0] 有区别吗?

我的猜测是,如果数据库类型不是字符串类型,(string)DataReader[0] 可能会失败,而DataReader[0].ToString() 只会将 DB null 之外的任何内容转换为字符串。是这样吗?

哪个更快?

【问题讨论】:

为了好玩,我会添加Convert.ToString(DataReader[0]); :-) "只会将 DB null 之外的任何内容转换为字符串" 实际上,DBNull.Value 确实有一个 ToString(),因为它是一个实际的对象,所以你可以在它上面调用 ToString()会正常工作的。 但是如果数据库中的 DataReader[0] 为空,ToString() 会抛出异常就是我的意思。 【参考方案1】:

这两个都向您介绍了潜在的数据异常,IMO 从阅读器那里读取的最佳方式是:

var x = reader[0] as string

然后对于数字/布尔值等,我总是使用可为空的类型,这样你就可以得到

var y = reader[1] as int?

现在,如果您出于某种原因绝对反对 nullables(我认为它们非常适合了解是否设置了某些内容)

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

【讨论】:

如果你期望一个字符串值并且你最终得到(比如说)一个整数,我宁愿看到一个异常而不是继续前进,好像我们 真的有一个null值。 我同意乔恩的观点。 了解您的数据。 @fearofawhackplanet ToString() 如果您调用它的对象为空,则会抛出空引用异常。除此之外,它每次都会返回一些东西。 (除非您对自定义对象的 ToString() 进行了错误的覆盖) @Chris:而我宁愿有一个空白页,也不愿用空数据覆盖某人的银行帐户。如果出现问题,尽快中止。继续使用不良数据是一个非常糟糕的主意。 @Chris:好吧,null 可能是数据的有效值 - 但由于架构问题,它实际上 不是数据库中的值。为什么要忽略不正常的架构?从根本上说,我们可以轻松在这一点上准确地发现错误 - 为什么推迟错误处理,并冒着我们以后无法发现问题的风险?同样,我坚持认为,在大多数情况下,最好的方法是在发现严重错误时立即失败。【参考方案2】:

(string)DataReader[0] 是类型转换。编译器会在编译时插入一些指令集,这些指令需要执行才能执行转换,并在失败时抛出异常。

DataReader[0].tostring() 是在运行时解析的函数调用,没有异常。

如果我错了,请专家指正。

【讨论】:

【参考方案3】:

我知道对这个问题发表评论为时已晚,但我认为很多人对(string)objectobject.ToString() 有类似的疑问,而这个问题是发表评论的正确位置。

当它确定对象的类型是字符串时,最好执行typecasting 而不是调用方法.ToString()。如果你查看ToString()的代码:

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

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

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

如果您想查看 (string) 与 .ToString() 的性能基准,请点击链接:(string) vs .ToString()

【讨论】:

以上是关于(string)reader[0] 和 reader[0].ToString() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

reader,字符流

IO流-----(字符流)

golang strings.NewReader

Scipoptsuite-6.0.0中的GCG编译错误:reader_zpl.c :(。text + 0x319):对`zpl_read'的未定义引用

reader.ReadToEnd 和 Stream.Read 之间的区别

go 基本IO接口