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

有没有理由在最后一次使用中检查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();

带着敬意,

疯狂的男孩

不,这不是必要的。

但是从ExecuteReader的定义开始 ,它与using子句无关。 ExecuteReader要么返回一个(非null)DataReader对象,要么抛出exception。
if语句中的表达式将始终为true(如果已达到)。

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

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

不,你为什么这样做? 该文档并未暗示它可能为null。 无论如何,如果它 null,你会怎么做? 再试一遍?

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

但是,ADO接口可以插入任何其他数据库提供程序,并通过ADO基类(DbConnection,DbCommand等)使用它们。 似乎有些提供程序有时会返回null ( MySQL也许 ?),这可能是程序员插入它的原因。 或者只是因为ReSharper在这里发出警告 ? 这可能是原因,即使使用的提供者遵循合同也没有必要。

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

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

似乎null检查是值得的,只是为了避免对象为null的微小机会。 看看我的回答如何在循环中修改队列集合?

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

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

替代文字http://sofzh.miximages.com/c%23/Untitled.png

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

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

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

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