(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)object
和object.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() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
Scipoptsuite-6.0.0中的GCG编译错误:reader_zpl.c :(。text + 0x319):对`zpl_read'的未定义引用