C# (字符串)读取器[0]和读取器[0]之间的差异。ToString()

C# (字符串)读取器[0]和读取器[0]之间的差异。ToString(),c#,tostring,datareader,C#,Tostring,Datareader,DataReader[0].ToString()和(string)DataReader[0]之间有区别吗 我的猜测是,如果数据库类型不是字符串类型,则(string)DataReader[0]可能会失败,其中DataReader[0]。ToString()只会将DB null之外的任何内容转换为字符串。是这样吗 哪一种更快?这两种方法都会向您介绍潜在的数据异常,在我看来,从读卡器读取数据的最佳方式是: var x=reader[0]作为字符串 然后对于数字/布尔值等,我总是使用可空类型,这样您就

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


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


哪一种更快?

这两种方法都会向您介绍潜在的数据异常,在我看来,从读卡器读取数据的最佳方式是:

var x=reader[0]作为字符串

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

var y=读卡器[1]为int?

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

int i=(读卡器[1]作为int?)。GetValueOrDefault()
(字符串)数据读卡器[0]正在进行类型转换。编译器将在编译时插入一些需要执行的指令集,以便执行转换,并在未能执行转换时抛出异常

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


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

我知道现在评论这个问题已经太迟了,但我认为许多人对
(string)object
object.ToString()
也有类似的疑问,而这个问题正是评论的正确地方

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

    public virtual string ToString()
    {
      return this.GetType().ToString();
    }
它首先通过调用
GetType()
方法找到对象的类型,然后调用该类型的
ToString()

如果我们不确定
对象的类型,那么答案将是do
ToString()
,而不是
(string)


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

作为一点乐趣,我将添加
Convert.ToString(DataReader[0])
:-)“将DB null之外的任何内容转换为字符串”实际上,
DBNull.Value
确实有一个
ToString()
,因为它是一个实际的对象,所以您可以对它调用
ToString()
,它可以正常工作。但是如果DB中的DataReader[0]为null,
ToString()
会引发异常是我的意思。如果你期望一个字符串值,而你最终得到(比如)一个整数,我宁愿看到异常,也不愿继续像我们真的有一个
null
值一样。我同意Jon的观点。了解您的数据。@fearofahackplanet
ToString()
如果您调用它的对象为null,它将抛出null引用异常。除此之外,它每次都会返回一些东西。(除非你对自定义对象的
ToString()
)有一个错误的覆盖)@Chris:然而我宁愿有一个空白页,也不愿用空数据覆盖某人的银行账户。如果出现问题,请尽快中止。继续使用坏数据是一个非常糟糕的主意。@Chris:Well
null
可能是数据的有效值-但由于架构问题,它不是数据库中的实际值。为什么要忽略模式不正常?从根本上说,我们可以很容易地在这一点上发现错误——为什么要推迟错误处理,并冒着以后无法发现问题的风险?再一次,我坚持认为,在大多数情况下,一旦发现严重错误就立即失败是最好的方法。