zoukankan      html  css  js  c++  java
  • using

    using关键字有两个主要用途:

    • 作为指令,为命名空间创建别名或导入其他命名空间中的类型。
    • 作为语句,定义一个范围,在此范围的末尾将释放对象。

    using指令

    using指令有两个用途:

    • 导入其他命名空间中的类型:
    • using System.Text;
    • 为命名空间或类型创建别名:
    • using Project = PC.MyCompany.Project;

    using指令的特点:

    • using指令的作用范围限制为包含它的文件,在其他文件中的using指令,对现有文件无效。
    • using别名,用于方便讲标识符限定到命名空间或类型。using别名指令的右侧必须是一个完全限定类型。且与前面的using指令无关。
    • using指令,便于在命名空间中使用而类型,而不必指定命名空间。
    • using指令不提供对嵌套在指定命名空间中的任何命名空间的访问。

    示例1

    下面的示例演示如何为命名空间定义和使用using别名

    namespace PC
    {
        // Define an alias for the nested namespace.
        using Project = PC.MyCompany.Project;
        class A
        {
            void M()
            {
                // Use the alias
                Project.MyClass mc = new Project.MyClass();
            }
        }
        namespace MyCompany
        {
            namespace Project
            {
                public class MyClass { }
            }
        }
    }
    using别名指令的右侧不能由开放的泛型类型。例如,不能是List<T>,但可以为List<int>创建别名。

    示例2

    下面演示如何为类定义using指令和using别名:

    using System;
    
    // Using alias directive for a class.
    using AliasToMyClass = NameSpace1.MyClass;
    
    // Using alias directive for a generic class.
    using UsingAlias = NameSpace2.MyClass<int>;
    
    namespace NameSpace1
    {
        public class MyClass
        {
            public override string ToString()
            {
                return "You are in NameSpace1.MyClass.";
            }
        }
    
    }
    
    namespace NameSpace2
    {
        class MyClass<T>
        {
            public override string ToString()
            {
                return "You are in NameSpace2.MyClass.";
            }
        }
    }
    
    namespace NameSpace3
    {
        // Using directive:
        using NameSpace1;
        // Using directive:
        using NameSpace2;
    
        class MainClass
        {
            static void Main()
            {
                AliasToMyClass instance1 = new AliasToMyClass();
                Console.WriteLine(instance1);
    
                UsingAlias instance2 = new UsingAlias();
                Console.WriteLine(instance2);
    
            }
        }
    }
    // Output: 
    //    You are in NameSpace1.MyClass.
    //    You are in NameSpace2.MyClass.

    using语句

    便于正确使用IDisposable对象。

    示例

    下面演示如何使用using语句。

    using (Font font1 = new Font("Arial", 10.0f)) 
    {
        byte charset = font1.GdiCharSet;
    }

    File和Font是访问非托管资源的托管类型的示例。还有许多其他类型的非托管资源和对应封装这些资源的类库。所有这些类型都必须实现IDisposable接口。

    当使用IDisposable对象时,应该在using语句中声明和实例化此对象。using语句能自动调用对象的Dispose方法,在调用Dispose时对象离开其作用域。在using块中,对象时只读,不能修饰也不能重新赋值。

    using语句确保Dispose方法的调用,即使发生了异常。也可以将对象放在try块中并在finally块中调用Dispose来达到同样的效果,实际上,编译器就是将using语句转换为这种形式。上面的代码在编译时会扩展为下面形式:

    {
      Font font1 = new Font("Arial", 10.0f);
      try
      {
        byte charset = font1.GdiCharSet;
      }
      finally
      {
        if (font1 != null)
          ((IDisposable)font1).Dispose();
      }
    }

    如下所示,可以在using语句中声明一个类型的多个实例。

    using (Font font3 = new Font("Arial", 10.0f),
                font4 = new Font("Arial", 10.0f))
    {
        // Use font3 and font4.
    }

    也可以实例化资源对象之后,将变量传递给using语句。不过这不是最佳做法。在这种情况下,该对象在控制权离开using语句之后还可见,但它可能不再具有对非托管资源的访问权,如果尝试在using块外部使用该对象,就可能引发异常。所以最好在using语句中实例化该对象并将其作用域限制在using块中。

    Font font2 = new Font("Arial", 10.0f);
    using (font2) // not recommended
    {
        // use font2
    }
    // font2 is still in scope
    // but the method call throws an exception
    float f = font2.GetHeight();
  • 相关阅读:
    ADX3000的组网配置
    cuda编程知识普及
    最优的cuda线程配置
    JBOSS在win7环境下启动run.bat无反应
    2013年8月第2个周结
    JBOSS AS 性能调整优化
    jquery插入第一个元素? [问题点数:20分,结帖人zsw19909001]
    @Inject 注入 还是报空指针
    css3 box-shadow阴影(外阴影与外发光)讲解
    事务模板
  • 原文地址:https://www.cnblogs.com/jiawei-whu/p/4343589.html
Copyright © 2011-2022 走看看