首页 > 编程语言 >C#中using的使用方式

C#中using的使用方式

时间:2023-06-24 09:34:08浏览次数:23  
标签:语句 IDisposable 方式 C# 别名 try new using

C#中 using 关键字主要有以下几种方式。

1. 引入命名空间

例如:using System,几乎每个类中都会用到。

2.为引入的命名空间起别名

using + 别名 = 包括详细命名空间信息的具体的类型

using aClass = NameSpace1.MyClass;
using bClass = NameSpace2.MyClass;

优点:当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候。当需要用到这个类型的时候,就每个地方都要用详细命名空间的办法来区分这些相同名字的类型。而用别名的方法会更简洁,用到哪个类就给哪个类做别名声明就可以了。注意:并不是说两个名字重复,给其中一个用了别名,另外一个就不需要用别名了,如果两个都要使用,则两个都需要用using来定义别名的。

3.自动释放创建的对象

作用:

1. 自动释放非托管资源,避免缓存,内存溢出,允许程序员指定使用资源的对象应当何时释放资源。

2. 简化try catch 得到在此定义域内自动释放所新建的对象,以简化代码;

 

本质:在程序编译阶段,编译器会自动将using语句生成为try-finally语句,并在finally块中调用对象的Dispose方法,来清理资源。所以,using语句等效于try-finally语句。

1   Font f2 = new Font("Arial", 10, FontStyle.Bold);
2  try
3  {
4      
5   }
6  finally
7  {
8     if (f2 != null) ((IDisposable)f2).Dispose();
9  } 

 

注意事项:

1. 括号内使用的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。禁止为不支持IDisposable接口的类型使用using语句,否则会出现编译错误。

1 using (MemoryStream ms = new MemoryStream())
2 {
3     qrCodeImage.Save(ms, ImageFormat.Jpeg);
4     returnImageData = ms.GetBuffer();
5     ms.Close();
6 }

 

2. using语句适用于清理单个非托管资源的情况,而多个非托管对象的清理最好以try-finnaly来实现,因为嵌套的using语句可能存在隐藏的Bug。内层using块引发异常时,将不能释放外层using块的对象资源。

3. using语句支持初始化多个变量,但前提是这些变量的类型必须相同,例如:

using(Pen p1 = new Pen(Brushes.Black), p2 = new Pen(Brushes.Blue))
{
   
}

 4. 针对初始化对个不同类型的变量时,可以都声明为IDisposable类型

1 using (IDisposable font = new Font("Verdana", 12), pen = new Pen(Brushes.Black))
2 {
3    float size = (font as Font).Size;
4    Brush brush = (pen as Pen).Brush;
5 }

 

标签:语句,IDisposable,方式,C#,别名,try,new,using
From: https://www.cnblogs.com/mingcore/p/17500671.html

相关文章

  • python: object 专有方法
     """StudentScoreInfo.py学生成绩类date2023-06-16edit:GeovinDu,geovindu,涂聚文ide:PyCharm2023.1python11"""importdatetimeimportsysimportosclassStudentScore(object):"""学生成绩类"&q......
  • P8026 [ONTAK2015] Bajtocja 做题笔记
    题目链接一道好题,本来是做几道启发式合并玩玩,没想到是个哈希。这一道题需要维护连通性,显然想到使用并查集。如果两个点在某个图内的父亲相同,显然这两个点就连通了。但是如果每链接一对点我们就遍历所有点对然后判断父亲,显然爆炸。于是考虑借鉴一下CSP2022T3的思路,对于每......
  • python-docx处理Word
     用到的库?123456fromdocximportDocument(文档读写)fromdocx.sharedimportPt,Cm,Inches(字体大小,不一定全用到)fromdocx.oxml.nsimportqn(设置字体格式,分栏等用到)fromdocx.sharedimportRGBColor(设置字体颜色)fromdocx.enum.textimportWD_ALIG......
  • spring框架里的spring context模块介绍,它和spring core有什么关联?
    springcontext模块介绍Spring框架是一个开源的Java开发框架,它提供了一系列的功能和工具,用于简化Java应用程序的开发。SpringContext模块是Spring框架的核心部分之一,它主要负责管理和协调应用程序中的对象。SpringContext模块的主要功能包括:IoC容器(Inversi......
  • 用applescript脚本实现检测手机号码是否注册imessage的原理
    一、检测数据的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2.编写脚本控制Macos/iphon......
  • AtCoder Regular Contest 154 C Roller
    洛谷传送门AtCoder传送门被这题干爆了考虑把环压缩成块。这样一次操作就是,选择两个相邻的块,把左边块长度减\(1\),右边块长度加\(1\)。特判\(a,b\)所有块长都是\(1\)的情况,这种情况不能操作。排除掉上面的情况,我们断言:有解的充要条件是,存在某一种\(a\)的顺序,使得\(b......
  • pycharm 经常遇到模块包已经下载,但是运行提示模块没有找到的问题
    作为新手在使用pycharm启动djang框架服务的过程中经常遇到,明明模块包已经下载安装,但是提示模块没有安装的问题,这个问题一般就是在启动django的时候,python解释器地址不是当前自己包所下载的地址更换到模块包下载的虚拟环境的地址,重新启动即可......
  • 基于FPGA的FSK调制解调通信系统verilog实现,包含testbench
    1.算法仿真效果vivado2019.2仿真结果如下:   2.算法涉及理论知识概要       频移键控是利用载波的频率变化来传递数字信息。数字频率调制是数据通信中使用较早的一种通信方式,由于这种调制解调方式容易实现,抗噪声和抗衰减性能较强,因此在中低速数字通信系统中得......
  • C++面试八股文:聊一聊指针?
    C++面试八股文:聊一聊指针?某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地......
  • go使用 github.com/influxdata/influxdb/client/v2 写数据到 influxdb
    转载请注明出处:接入示例使用github.com/influxdata/influxdb/client/v2依赖包向InfluxDB写入数据的示例代码:packagemainimport("fmt""log""time""github.com/influxdata/influxdb/client/v2")const(MyDB=&......