【问题标题】:(string)reader[0] vs Convert.ToString(reader[0])(string)reader[0] vs Convert.ToString(reader[0])
【发布时间】:2010-02-15 14:09:00
【问题描述】:

什么更好

var s =  (string)reader[0]  

var s = Convert.ToString(reader[0])

?

【问题讨论】:

  • 为什么不选择 reader[0].ToString()?
  • 你能定义“更好”吗?快点?更健壮?更容易阅读?更小的内存占用?

标签: c# ado.net sqldatareader


【解决方案1】:

我会说reader.GetString(0)

【讨论】:

  • NETFX 2 的 Circra 版本我做了很多研究,发现带有索引外观的 Get 方法是所有阅读器方法中表现最好的。
  • 我也在 3.5 中对此进行了测量,发现其性能明显优于 (string)reader[0]
  • reader.GetString(0) 读取 blob 值是否存在问题,例如Varchar(Max)?
【解决方案2】:
// Conveys that you are sure that reader[0] is a string and 
// if it's not you probably have bigger problems 
// than the resulting exception
var s =  (string)reader[0];

// Conveys that you are hoping that reader[0] is convertible to a string
var s = Convert.ToString(reader[0])

所以这可能是一个考虑上下文的​​选择问题。

【讨论】:

  • +1 用于考虑代码的可读性和意图,而不仅仅是性能。
【解决方案3】:

为什么没有人考虑可读性和可维护性?

我知道作者问的是:

var s =  (string)reader[0]      
or    
var s = Convert.ToString(reader[0])

但是呢:

string s = reader["Fieldname"].ToString(); 

如果您交换/删除/添加列并且索引正在更改,那将更具可读性和安全性......这肯定更值得。

有人说硬演员的速度要快 30%。那么 1 毫秒的 30% 是 1,333 毫秒?肯定不会占整个数据获取的 30%。

【讨论】:

  • 这个答案应该被注意。
【解决方案4】:

如果 reader[0] 实际上是一个字符串,那么(string)reader[0]

它更清晰,而且很可能更快(除非编译器做了一些我不知道的神奇优化)。

【讨论】:

    【解决方案5】:
    var s =  (string)reader[0]  
    

    如果不能转换为字符串,会给你一个类转换异常,而

    var s = Convert.ToString(reader[0])
    

    会更优雅地处理它,如果它不能被转换,你会得到 null。这还将为 reader[0] 处理更多类型的对象,因为另一种方法仅允许类型可以转换为字符串的转换,而这将支持 Convert 类可以处理的任何类型。我认为更多。但可能不是……

    【讨论】:

      【解决方案6】:

      这更快,在我的测试中大约快 ~30%

      var s =  (string)reader[0];
      

      但是,当它为 null 时,它不会爆炸:

      var s = Convert.ToString(reader[0]);
      

      【讨论】:

        【解决方案7】:

        reader.GetString(0);怎么样?

        【讨论】:

          【解决方案8】:

          怎么样

          阅读器[0].ToString();

          【讨论】:

            【解决方案9】:

            我猜reader[0].ToString();

            【讨论】:

              【解决方案10】:

              我会去

              reader[0].ToString();
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-08-28
                • 1970-01-01
                • 2013-01-02
                • 1970-01-01
                • 2014-10-31
                • 2019-03-11
                • 2013-09-15
                • 2010-09-25
                相关资源
                最近更新 更多