新手请教 : 到底是用TryCatch好还是Using好?
如题。问题总结如下:
问题一: 不知道用哪个好?
问题二: using里面可以加上Try...Catch吗?
问题三: 在Finally里要不要加上连接的Dispose()方法呢?
两个方法的代码我都写了,如下:
方法一: 使用TryCatchFinally:
- C# code
//方法一: 使用TryCatchFinally public static List<ClassA> GetListTryCatch() { List<ClassA> list = new List<ClassA>(); string queryString = @"select * from tableA"; OracleConnection connection = null; try { connection = new OracleConnection(connectionString); OracleCommand command = new OracleCommand(); command.Connection = connection; command.CommandText = queryString; connection.Open(); OracleDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { ClassA ca = new ClassA(); ca.ItemName = reader.GetString(0); ca.TargetValue = reader.GetDouble(1); list.Add(ca); } } catch (Exception) { throw; } finally { connection.Close(); // connection.Dispose(); // 不知道要不要加这句 } return list; }方法二: 使用Using:
- C# code
//方法二: 使用Using public static List<ClassA> GetListUsing() { List<ClassA> list = new List<ClassA>(); string queryString = @"select * from tableA"; // use using using (OracleConnection connection = new OracleConnection(connectionString)) { OracleCommand command = new OracleCommand(queryString, connection); connection.Open(); using (OracleDataReader reader = command.ExecuteReader()) { // Always call Read before accessing data. while (reader.Read()) { ClassA ca = new ClassA(); ca.ItemName = reader.GetString(0); ca.TargetValue = reader.GetDouble(1); list.Add(ca); } } } return list; }[解决办法]
// connection.Dispose(); // 不知道要不要加这句
在建立一个连接后默认会创建相应的连接池。你确认你以后不会再用到与此相同的连接就可以用此语句
而如果你还会用同样的连接操作时不应用此语句。影响性能
一般情况用using,但有的情况不得不手动开关
[解决办法]
我喜欢using,少写几个字符
[解决办法]
using里面也是需要try的,只是他代替了finally的左右而以
[解决办法]
using语句,定义一个范围,在范围结束时处理对象。
场景:
当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using也很方便。
例如:
- C# code
using (Class1 cls1 = new Class1(), cls2 = new Class1()){ // the code using cls1, cls2} // call the Dispose on cls1 and cls2
------解决方案--------------------
两者完全没有可比性...using只是自动调用具有IDisposable接口对象的Dispose方法,不能也不可能代替try...
[解决办法]
using 清理非托管资源,不受GC控制的资源。Using结束后会隐式的调用Disposable方法。
但是当对象使用using关键字的时候,必须实现IDisposable接口。using的使用和try-catch-finaly中,在finaly代码域调用Disposable方法效果一样。Using不能使用多个不同的类
[解决办法]
其实.net本身并没有using,c#、vb.net编译器将using编译为合适的try...catch...finally,所以你不用画蛇添足地再自己在Using内外部再重复写try...catch...finally。
如果你使用reflector这类反编译工具,它会按照c#的方式解析为using,所以你应该使用MSIL来看真正的底层代码,就可以看到Using本身实际就是try...catch....finally。
[解决办法]
如 sp123所说,
using 展开编译之后就是 try-catch-finally
当然它只关注 finally,通过 finally 代码块来确保调用被 using 的对象 Dispose 方法 (被 using 的对象要求实现
IDispose 接口
[解决办法]
例如代码- C# code
static void Main(){ using (var x = new Domain.Client()) { int i = 0; }}
[解决办法]
问题一: 不知道用哪个好?
=======
推荐 using ! 你可能知道能被using 的对应要求实现 IDispose 为什么呢?
以为
using(SqlConnection conn = ..) {
}
编译展开之后是
try {
SqlConnection conn = ...
}
finally {
conn.Dispose(); // 总是假定你有 Dispose 可以被使用
}
问题二: using里面可以加上Try...Catch吗?
=====
当然
问题三: 在Finally里要不要加上连接的Dispose()方法呢?
===
finally
{
connection.Close();
// connection.Dispose(); // 不知道要不要加这句 // 不用 Dispose 内部调用 Close()
}
4. 因此楼主需要认真的理解 using 到底是如何工作的?
从上面分析,试问如果 Connection 没有实现 IDispose 接口没有提供 Dispose 那么 Connection 功能是完整的吗? 档案是肯定的!
5. using 与 IDispose 实际上是一种“设计模式”,两者结合便于“高效编程”(恼人的try-cath-finally)同时也保证“释放资源”(假定类的实现者总是在Dispose正确释放资源)
6. SqlConnection.Close() 这个方法是 “功能”方法,没有它就是不完整的!
Hope helpful
[解决办法]
[解决办法]
[解决办法]