首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

新手请问 : 到底是用TryCatch好还是Using好

2012-09-07 
新手请教 : 到底是用TryCatch好还是Using好?如题。问题总结如下:问题一: 不知道用哪个好?问题二: using里面

新手请教 : 到底是用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
[解决办法]
探讨
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…

[解决办法]
探讨
想了想还是用TryCatch好了,虽然代码得多写点,但是万一SQL文有错误(如表不存在等),至少可以捕捉到异常并显示出来。
使用TryCatch的话还得关掉OracleDataReader吧? 在最后的Finally里关掉可以吧?
貌似OracleDataReader.ExecuteReader方法还可以传一个参数(CommandBehavior的属性),这里不用可以吧?

最后实现的代码如下,如果有错的话请帮忙指点出来,感激不尽!

C# code
public static List<ClassA> GetList(ref rpstrErrorMessage)
{
..............

[解决办法]
探讨
如果SQL执行有异常,如何在调用这个方法时捕捉异常,还是不大明白。

热点排行