是否有理由在c#中使用clausule在多个内部检查null?

时间:2010-02-08 08:55:17

标签: c# sql-server null

有没有理由在最后一次使用时检查是否为空?在我看来,它很可能不会被需要?

using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand(commandString, connection))
{
    using (var reader = command.ExecuteReader())
    {
      if (reader != null) {
         // Use the reader
      }
    }
   }
}

编辑:

如果我使用它,我应该关闭reader.Close()和connection.Close()吗:

            using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP))
            using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) {
                 while (sqlWrite.Read()) {
                  //something to do.
                 }
                 sqlWrite.Close();
                 varConnection.Close();
            }




    public static SqlConnection sqlConnectOneTime(string varSqlConnectionDetails) {
        SqlConnection sqlConnection = new SqlConnection(varSqlConnectionDetails);
        sqlConnect(sqlConnection);
        if (sqlConnection.State == ConnectionState.Open) {
            return sqlConnection;
        }
        return null;
    } 

在下面的例子中使用必要的关闭还是我可以跳过那两个?              sqlWrite.Close();              varConnection.Close();

关于,

MadBoy

6 个答案:

答案 0 :(得分:4)

不,这不是必需的。

但是从the definition of ExecuteReader开始,它与using子句无关。 ExecuteReader要么返回一个(非null)DataReader对象,要么抛出异常 if语句中的表达将始终为真(如果已达到)。

通过省略if和所有多余的支撑对,你可以更容易阅读:

using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(commandString, connection))
using (var reader = command.ExecuteReader())
{
    // Use the reader
}

答案 1 :(得分:3)

没有。为什么要这么做? The documentation并不表示它可能为空。无论如何,如果 为null,你会怎么做?再试一次?

答案 2 :(得分:1)

using语句不会为你检查null,所以如果command.ExecuteReader()可以返回null,你必须显式检查它,就像你的代码片段一样。

编辑:看起来在这种特殊情况下,ExecuteReader()现在应该返回null,所以你可以避免它。请记住,一般情况下你需要它。

答案 3 :(得分:1)

似乎null检查是值得的,只是为了避免该对象为null的可能性很小。看看我对How can I modify a queue collection in a loop?

的回答

在示例Queue.Dequeue()中,永远不应该返回null,但确实如此。这是一个极端的情况,但我不明白为什么你不想避免未处理的异常,特别是如果它像if (object != null)一样简单

对于Henk(您可以自己运行代码并获得类似的结果):

alt text http://www.ccswe.com/temp/Untitled.png

无论哪种方式,我只是简单地陈述我的观点,仅仅因为文档说它将做一件事并不意味着它总是会。不知道为什么我只是因为某人有不同意见而得到了downvote: - )

编辑:愚蠢的工具提示,无论哪种方式,你都可以看到处理的是9998065,遇到的空值是2264.如果我的示例代码存在根本性的错误,我会有兴趣听到它。我现在要退出这个主题。

答案 4 :(得分:1)

由于您专门使用SqlConnection和SqlCommand - 否,因此没有理由进行此检查。

但是,ADO接口可以插入任何其他数据库提供程序,并通过ADO基类(DbConnection,DbCommand等)使用它们。似乎某些提供商有时会返回nullMySQL maybe?),这可能是程序员插入此内容的原因。或者仅仅因为ReSharper issues a warning在这里?这可能是原因,即使使用的提供者没有必要遵守合同。

答案 5 :(得分:0)

在这种情况下,您不应该检查reader是否为null。

但是你可以使用Code Contracts库并使用Contract.Assume(或Contract.Assert)来编写你对代码的假设。在这种情况下,您可以使用工具进行静态分析,并从发布版本中轻松删除此检查。