zoukankan      html  css  js  c++  java
  • 第八节 C#的using语句

    前面的代示例展示了如果调用一个类型的Dispose或Close方法。如果决定显式的调用这两个方法之一,强烈建议吧他们放在一个异常处理finally块中。这样可以保证清理代码得到执行,因此,前代码示例可以修改成下面这种更好的形式:

       static void Main(string[] args)

            {

                Byte[] byteWrite = new Byte[] { 1, 2, 3, 4, 5 };

                FileStream fs = new FileStream("Temp.dat", FileMode.Create);

                try

                {

                    fs.Write(byteWrite, 0, byteWrite.Length);

                }

                finally

                {

                    if (fs != null)

                        fs.Dispose();

                }

                File.Delete(@"d:用户目录我的文档visual studio 2010ProjectsConsoleApplication1ConsoleApplication1inDebugTemp.dat");

            }

    添加异常处理代码时正确的,而且应该坚持这么做。幸好,c#提供了using语句,它提供了一种简化的语法来获得和上面代码相同的结果。下面演示了如何使用C#的using语句重写上面代码:

    static void Main(string[] args)

            {

                Byte[] byteWrite = new Byte[] { 1, 2, 3, 4, 5 };

                using (FileStream fs = new FileStream("Temp.dat", FileMode.Create))

                {

                    fs.Write(byteWrite, 0, byteWrite.Length);

                }

                File.Delete(@"d:用户目录我的文档visual studio 2010ProjectsConsoleApplication1ConsoleApplication1inDebugTemp.dat");

            }

    在using语句中,我们初始化一个对象,并将它的引用保存到一个变量中。然后再using语句的大括号里访问该变量。编译这段代码时,编译器自动生成一个try块和一个finally块,在finally中,编译器会生成代码将变量转型成一个IDisposable并调用Dispose方法。显然,using语句只能用于那些实现了IDisposable接口的类型。

    注意:c#语句支持初始化多个变量,只要这些变量的类型相同。另外,using语句还允许只使用一个已初始化的变量,

    Using语句也能用于实现了IDisposable的值类型。这样一来,我们就可以创建一个非常高效和有用的机制来封装”开始和结束一个操作”所需的代码。例如,假设要用一个Mutex对象来锁定一个代码块。Mutex类确实实现了IDisposable接口,但是在它上面调用dispose方法只会释放本地资源;不会对锁本身进行任何处理。为了简化锁定和解锁一个Mutex操作,可以定义一个值类型来封装Mutex对象的锁定和解锁操作。下面的MUTEXLOCK结构就是一个例子,随后的Main方法演示了如何高效的使用MutexLock结构。

        class Program

        {

            static void Main(string[] args)

            {

                Mutex m = new Mutex();

                using (new MutexLock(m))

                {

                }

            }

        }

        struct MutexLock : IDisposable

        {

            private readonly Mutex m_mutex;

            public MutexLock(Mutex m)

            {

                m_mutex = m;

                m_mutex.WaitOne();

            }

            public void Dispose()

            {

                m_mutex.ReleaseMutex();

            }

        }

  • 相关阅读:
    db2缓冲池调优
    linux下安装rpm出现error: Failed dependencies
    linux下挂载磁盘
    db2 常见错误以及解决方案[ErrorCode SQLState]
    db2数据库表操作错误SQL0668N Operation not allowed for reason code "1" on table "表". SQLSTATE=57016的解决方法
    db2用户权限赋值
    db2查看当前用户模式及当前用户的权限
    loadrunner常用函数整理
    书上的脚本案例
    hdu 1711---KMP
  • 原文地址:https://www.cnblogs.com/bingbinggui/p/4430244.html
Copyright © 2011-2022 走看看