C#学习笔记 - using语句
using语句
某些类型的非托管对象有数量限制或很耗费系统资源, 在代码使用完他们后, 尽快释放他们是很重要的using语句有助于简化这一过程, 并确保这些资源被适当的处理
(0)资源
指实现了System.IDisposable接口的类或结构. IDisposalbe接口中有个Dispose的方法, 使用这个方法去处置资源
-
如果正在使用的资源那部分代码中产生了一个异常的运行时错误, 那么可能处置资源的代码无法执行
(1)包装资源的使用
using语句帮助减少意外的运行时错误带来的潜在的问题, 整洁的包装了资源的使用
using(分配资源) 使用资源
using(ResourceType Identifier Expression) Statement
-
圆括号内代码表示分配资源
-
Statement是使用资源代码
-
using语句隐式产生处置该资源的代码
-
分配资源
-
把Statement放入try块
-
创建资源的Dispose方法的调用, 并把它放入finally块
-
例子
static void Main(string[] args) { //打开一个文本文件, 并向其中写入一行 using (TextWriter tw = File.CreateText("Lin.txt")) { tw.WriteLine("123123lin"); } //打开相同的文本文件, 一行一行读取并显示它的内容 using (TextReader tr = File.OpenText("Lin.txt")) { string InputString; while((InputString = tr.ReadLine()) != null) { Console.WriteLine(InputString); } } }
(3)多个资源和嵌套
声明相同类型的多个资源
using(ResourceType Id1 = Expr1, Id2 = Expr2) Statement
嵌套声明
using(ResourceType Id1 = Expr1) { Statement; using(ResourceType id2 = Expr2) { Statement; } }
例子
using (TextWriter tw1 = File.CreateText("Lin.txt"), tw2 = File.CreateText("Fra.txt")) { tw1.WriteLine("123123lin"); tw1.WriteLine("123123fra"); } using (TextReader tr1 = File.OpenText("Lin.txt"), tr2 = File.OpenText("Fra.txt")) { string InputString; while ((InputString = tr1.ReadLine()) != null) { Console.WriteLine(InputString); } while ((InputString = tr2.ReadLine()) != null) { Console.WriteLine(InputString); } }
using (TextWriter tw1 = File.CreateText("Lin.txt")) { tw1.WriteLine("123123lin"); using (TextWriter tw2 = File.CreateText("Fra.txt")) tw1.WriteLine("123123fra"); } using (TextReader tr1 = File.OpenText("Lin.txt"), tr2 = File.OpenText("Fra.txt")) { string InputString; while ((InputString = tr1.ReadLine()) != null) { Console.WriteLine(InputString); } while ((InputString = tr2.ReadLine()) != null) { Console.WriteLine(InputString); } }
(4)提前声明形式
TextWriter tw = File.CreateText("lin.txt"); using (tw) { tw.WriteLine("123123lin"); }
-
虽然这样也能保证使用完整资源后总是会调用Dispose方法
-
但它不能防止在using语句已经释放了它的非托管资源后使用该资源
-
这可能会导致状态不一致, 提供了较少的保护, 不推荐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具