假设我有以下代码:
private void UpdateDB(QuoteDataSet dataSet, Strint tableName)
{
using(SQLiteConnection conn = new SQLiteConnection(_connectionString))
{
conn.Open();
using (SQLiteTransaction transaction = conn.BeginTransaction())
{
using (SQLiteCommand cmd = new SQLiteCommand("SELECT * FROM " + tableName, conn))
{
using (SQLiteDataAdapter sqliteAdapter = new SQLiteDataAdapter())
{
sqliteAdapter.Update(dataSet, tableName);
}
}
transaction.Commit();
}
}
}
C#文档声明,使用using
语句,范围内的对象将被处理,我已经看到了几个地方建议我们不需要使用try / finally子句。
我通常用try / finally包围我的连接,并且我总是关闭finally子句中的连接。鉴于上述代码,如果存在异常,假设连接将被关闭是否合理?
答案 0 :(得分:19)
You are correct; the using
statement compiles to a try
/ finally
block
编译器将using(resource) statement;
转换为以下代码:
{
ResourceType resource = expression;
try {
statement;
}
finally {
if (resource != null) ((IDisposable)resource).Dispose();
}
}
(如果IDisposable
明确实施ResourceType
,则转化为IDisposable
。
答案 1 :(得分:10)
是的,您需要使用try / finally或using语句。你不需要两者。
using statement与try / finally几乎相同,只是在C#3中你无法重新分配到使用块内的变量。
using (IDisposable d = foo())
{
d = null; // Error: Cannot assign to 'd' because it is a 'using variable'
}
以前你可以重新分配,但原始对象仍然会被处理,而不是新分配的对象,你也会得到这个编译警告:
可能错误地赋值给本地'd',这是using语句或lock语句的参数。处理呼叫或解锁将发生在本地的原始值上。
答案 2 :(得分:6)
是的,using
语句几乎只是try ... finally
块的简写。
例如,这段代码......
using (MyDisposableType foo = new MyDisposableType())
{
foo.DoSomething();
}
......等同于......
{
MyDisposableType foo = new MyDisposableType();
try
{
foo.DoSomething();
}
finally
{
if (foo != null)
((IDisposable)foo).Dispose();
}
}
答案 3 :(得分:1)
如果出现异常,您可以假设连接将被关闭。
答案 4 :(得分:1)
使用()可确保在参数中实例化的项目将被处理掉,而不管相关代码块中发生的情况如何。这包括关闭数据库连接,假设SQLiteConnection
正确处理其处置。