using的另一种用法

转载 2007年10月05日 16:58:00
 
先看下面的代码:
   using( Form_Arg arg=new Form_Arg(this.ip,this.port,this.limit) )
   {
       arg.Left = this.Left + 30;
       arg.Top  = this.Top + 25;
       arg.ShowDialog();
        arg.Get(out this.ip, out this.port, out this.limit);
   }

我以前经常使用“using System;“或者”using System.IO”等加入新Namespace, 上面的代码我没有使用过,不知道这段代码是什么意思,所以拜读MSDN,里面有下面的解释:
using
可以取得一个或者多个资源,执行一个陈述式(Statement),接着处置(Dispose)该资源.
using(
资源撷取) 内嵌陈述式
using(ResourceType resource = expression) statement

上面的解释已经很清楚的,using后面的括号里面写上资源的名字,程序处理资源里面的代码之后自动清除该资源,下面是msdn的范例:
范例将建立名称为log.txt的档案,并将两行文字写入档案内。接着,该范例就会开启相同的档案以读取所包含的文字行,并将文字行复制到主控台。
using System;
using System.IO;
 
class Test
{
    static void Main()
    {
        using (TextWriter w = File.CreateText("log.txt"))
        {
            w.WriteLine("This is line one");
            w.WriteLine("This is line two");
        }
        using (TextReader r = File.OpenText("log.txt"))
        {
            string s;
            while ((s = r.ReadLine()) != null)
            {
                Console.WriteLine(s);
            }
        }
    }
}
因为TextWriterTextReader类别会实作IDisposable接口,因此,这项范例可以使用using陈述式以确认已经正确地关闭在写入或读取作业后的基础档案。

下面是msdn的说明:
当您撰写使用封装资源之对象的程序代码时,您应该确定在使用完该对象时会呼叫对象的 Dispose 方法。您可以使用 C# using 陈述式,或其它适用于 Common Language Runtime 的程序语言中实作 try/finally 区块,来执行这个动作。
C# Using 陈述式
C# 程序语言的 using 陈述式会藉由简化您必须为建立和清除对象而撰写的程序代码,以较为自动的方式呼叫 Dispose 方法。Using陈述式会取得一项或多项资源、执行您指定的陈述式,然后处置该对象。请注意,using陈述式对于对象之存留期不超过建构该对象之方法的对象才有用。下列程序代码范例会建立并清除 ResourceWrapper 类别的执行个体,一如之前在 C# 实作 Dispose 方法范例中所提供的说明。
class myApp
    {  
        public static void Main()  
        {     
            using (ResourceWrapper r1 = new ResourceWrapper())     
            {        
                // Do something with the object.        
                r1.DoSomething();     
            }  
        }
}
前面含有 using 陈述式的程序代码,就相当于下列情形。
class myApp
    {  
        public static void Main()  
        {     
            ResourceWrapper r1 = new ResourceWrapper();      
            try     
            {        
                // Do something with the object.        
                r1.DoSomething();     
            }     
            finally     
            {        
                // Check for a null resource.        
                if (r1 != null)        
                    // Call the object's Dispose method.        
                    r1.Dispose();     
            }  
        }
    }


using 陈述式可取得一个或多个资源、执行一陈述式、接着处置 (Dispose) 该资源。
using 陈述式:
using   (    资源撷取   )    内嵌陈述式
资源撷取:
区域变量宣告
表达式
资源为实作 System.IDisposable 的类别或结构,它包含了名为 Dispose 的单一无参数方法。使用资源的程序代码可呼叫 Dispose 来指出该资源已不再需要。若未呼叫 Dispose,最后将由于内存回收而发生自动的处置。
资源撷取的形式为区域变量宣告,那么区域变量宣告的型别必须为 System.IDisposable 或可隐含转换成 System.IDisposable 的型别。如果资源撷取的形式为表达式,则此表达式必须为 System.IDisposable 型别或可隐含转换成 System.IDisposable 型别。
宣告于资源撷取的区域变量为只读,并需包含一个初始设定式。如果内嵌陈述式尝试修改这些区域变量 (透过设定或 ++ 和 -- 运算子),或将它们当成 ref 或 out 参数传递,就会发生编译时期错误。
using 陈述式将转译成三个部分:撷取、使用方式和处置。资源的使用方式将隐含地包含于具有 finally 子句的 try 陈述式内。此 finally 子句会处置这些资源。若取得 Null 资源,则不会呼叫 Dispose,也不会掷回任何例外状况。
下列形式的 using 陈述式
using (ResourceType resource = expression) statement
对应到两个可能展开中的其中一个。当 ResourceType 为数值型别时,展开为
{
                ResourceType resource = expression;
                try
                {
                    statement;
                }
                finally
                {
                    ((IDisposable)resource).Dispose();
                }
}
否则,当 ResourceType 为参考型别时,展开为
{
                ResourceType resource = expression;
                try
                {
                    statement;
                }
                finally
                {
                    if (resource != null) ((IDisposable)resource).Dispose();
                }
 }
在任何一种展开中,在内嵌陈述式中的 resource 变数都是只读的。
下列形式的 using 陈述式
using (expression) statement
拥有相同的两种可能展开,但在此状况中,ResourceType 为 expression 的隐含编译时期型别,而在内嵌的陈述式中无法存取 resource 变量,而且它也是不可见的。
资源撷取采取区域变量宣告的形式,就可能取得特定型别的多重资源。下列形式的 using 陈述式
using (ResourceType r1 = e1, r2 = e2, ..., rN = eN) statement
完全等于一序列巢状的 using 陈述式:
using (ResourceType r1 = e1)  
using (ResourceType r2 = e2)     
...        
using (ResourceType rN = eN)           
        statement
 
 

相关文章推荐

C语言中va(可变函数参数) 的另一种用法与危险事项

C语言中的可变参数va(va_arg) 大家应该比较熟悉了,主要是用来解决函数参数类型与个数不确定的问题,基本用法与详细请移步这里。 通常的用法是把va_arg放在等号右边,提取其值来使用: ...

正规方程的另一种解释

  • 2011-08-05 12:51
  • 238KB
  • 下载

Android 解决ListView 和 ScrollView 共存冲突的问题(另一种解决方案)

ListView 与 ScrollView 同在一个界面用头脑想想都觉得不大可能这样做,但还真的有美工这样做了,有点郁闷~!!沟通无果,解决之~~~~!初期还真没啥头绪,Google 一下看到有很多同...

Omni-NFS-X Windows与Linux间通讯的另一种方式

windows/winnt4.0/win2000与Linux/FreeBSD/UNIX like之间的通信一般最好的方法,也是我们最容易接受的方试是“网上邻居”。目前能做到这一点的最好的程序是Samb...

【Android】另一种Tab的实现--TabLayout

在我们的应用市场上的程序,十个应用程序有九个是采用了Tab页卡的这样一种形式。实现的方式也各不相同,古老的TabHost,ViewPager+Fragment+自定义的Title,3.0后Action...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)