温故之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>();
        }
    }
}
复制代码

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

命名空间别名

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

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

则可以通过别名的方式来解决此问题(不用为每一个冲突的命名空间取别名):

注意第二行中代码 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语句,否则会出现编译错误;

    实现了IDisposable接口之后:

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

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


至此,C#中 using的使用及其注意事项讲解完毕,欢迎您来探讨!个人微信二维码如下:

转载于:https://juejin.im/post/5b227fecf265da59765476c4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值