有没有理由在最后一次使用时检查是否为空?在我看来,它很可能不会被需要?
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
答案 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等)使用它们。似乎某些提供商有时会返回null
(MySQL maybe?),这可能是程序员插入此内容的原因。或者仅仅因为ReSharper issues a warning在这里?这可能是原因,即使使用的提供者没有必要遵守合同。
答案 5 :(得分:0)
在这种情况下,您不应该检查reader是否为null。
但是你可以使用Code Contracts库并使用Contract.Assume(或Contract.Assert)来编写你对代码的假设。在这种情况下,您可以使用工具进行静态分析,并从发布版本中轻松删除此检查。