下载APP

C# using注意事项

说明:温故即温习之前已经掌握但比较模糊的知识;取自于“温故而知新”

using 在C#中有三种使用场景,如下:

  1. 引用命名空间;
  2. 为命名空间取一个易于使用的别名;
  3. 帮助管理非托管资源。

引用命名空间

使用场景:当需要使用某一个命名空间中的类型时,通过using可以免去引用该类型时,输入完全限定名的痛苦(因为命名空间大多比较长)。

当不引入命名空间的时候,需要这样引用命名空间中的类型

namespace UsingDemo {
    class Program {
        static void Main(string[] args) {
            System.Collections.Generic.List<string> tmp = new System.Collections.Generic.List<string>();
        }
    }
}

当引用了命名空间的时候,仅需要按下面引用即可

using System.Collections.Generic;

namespace UsingDemo {
    class Program {
        static void Main(string[] args) {
            List<string> tmp = new List<string>();
        }
    }
}

引用命名空间时需注意命名空间引用位置:

  1. 引用位置可在文件顶部或当前命名空间的顶部;
  2. 不可在类的内部、函数内部、属性内部引用,否则会编译错误。

正确示例如下:

// 在文件顶部引入
using System.Collections.Generic;

namespace UsingDemo {
     class Program {
         static void Main(string[] args) {
             List<string> tmp = new List<string>();
         }
     }
 }
namespace UsingDemo {
   // 当前命名空间的顶部引入
    using System.Collections.Generic;
    class Program {
        static void Main(string[] args) {
            List<string> tmp = new List<string>();
        }
    }
}

错误示例如下(会编译错误,即代码下面会有很多红色的波浪线): image

命名空间别名

使用场景:引入的多个命名空间中的类型产生冲突,并且冲突的命名空间都是程序需要的。

比如以下代码,编译器会告诉我们,有多个可以匹配的类型(即有歧义): image

则可以通过别名的方式来解决此问题(不用为每一个冲突的命名空间取别名): image 注意第二行中代码using WM = System.Windows.Media;,此处就是将WM定义为命名空间System.Windows.Media; 的别名,因此后续才可以通过【别名.类型】的方式引用,如下:

WM.Color color2 = new WM.Color();

帮助管理非托管资源

使用场景:

  • 当程序需要使用非托管资源,如文件操作、网络操作、数据库操作等,使用using对其管理会更方便、安全;
  • 需要在GC的时候强制回收的对象(如过多的大图,则可实现IDisposable接口,进行强制管理 );
  • 程序中,需要非托管资源的生命周期需要与类相同时,则可以通过为该类实现IDisposable接口,来更加方便的管理非托管资源。

示例代码如下:

// 示例一
namespace UsingDemo {
    class Program {
        static void Main(string[] args) {
            using (FileStream fs = new FileStream("C://using_demo.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)) {
                byte[] data = Encoding.UTF8.GetBytes("Hello Using!");
                fs.Write(data, 0, data.Length);
            }
        }
    }
}
// 示例二: 非托管资源的生命周期需要与类相同
namespace UsingDemo {
    class Demo : IDisposable {
        private FileStream fileStream;
        public void Dispose() {
            // 此处手动释放资源 
            fileStream?.Dispose();
        }
    }

    class Program {
        static void Main(string[] args) {
            using (Demo demo = new Demo()) {
            }
        }
    }
}

注意事项:

  • using只能用于实现了IDisposable接口的类型,不能为未实现IDisposable接口的类型使用using语句,否则会出现编译错误;

image 实现了IDisposable接口之后: 实现了IDisposable接口

  • 如果有多个非托管资源需要管理,则使用嵌套的using语句将会更加合适,但内层using最好不要有异常产生,否则内层using块引发异常时,则有可能无法正确释放外层using块的资源;

鉴于此,不建议使用嵌套的using语句

  • using语句支持初始化多个变量,但前提是这些变量的类型必须相同。image

给个关注呗,让我们一起学习互联网技术