Silentdoer

导航

C#基础:在using中创建对象

在using中创建的对象的类必须是实现了IDispose接口的类,示例代码如下:

static void Main(string[] args)
        {
            Method();
            Console.WriteLine("OkMain");
            Console.ReadKey();
        }

        public static void Method()
        {
            using(var cnt = new SqlConnection("server=192.168.0.111;database=TestDb;uid=sa;pwd=pass"))
            {
                cnt.Open();
            }
            Console.WriteLine("OkMethod");
        }

网上很多人说:

using(var cnt = new SqlConnection("server=192.168.0.111;database=TestDb;uid=sa;pwd=pass"))

{

cnt.Open();

}

Console.WriteLine("MethodOk");

就相当于

var cnt = new SqlConnection("server=192.168.0.111;database=TestDb;uid=sa;pwd=pass");

try{

cnt.Open();

}finally

{

cnt.Close();

}

Console.WriteLine("MethodOk");

对于上面的代码我的理解是:

很明显,如果var cnt = new SqlConnection("server=192.168.0.111;database=TestDb;uid=sa;pwd=pass");出现异常,肯定会抛给此函数的上级函数,故后面的代码均不执行

然后,由于上面的try-finally没有catch部分,故它只有异常监测能力,而没有手动的异常捕获能力。

故如果cnt.Open();出现异常,则首先进入finally中执行cnt.Close();然后将此异常抛给此函数的上级,故Console.WriteLine("MethodOk");也不会执行

如果此函数的上级函数没有手动捕获这个函数,则该上级函数的调用此函数代码的后面代码也不会执行,且继续将异常往上上级函数抛(但异常Trace信息应该是有更新的)。

posted on 2017-01-18 11:56  Silentdoer  阅读(826)  评论(0编辑  收藏  举报