是否有理由在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)来编写您对代码的假设。 在这种情况下,您可以使用工具进行静态分析,并从发布版本中轻松删除此检查。