当前位置: 首页 > news >正文

C# 中using关键字的使用

在C#中我们还是很有必要掌握using关键字的。

比如这样:

string path = “D:\data.txt”;
if (!File.Exists(path ))
{File.Create(path);                       File.WriteAllText(path,"OK");                                         
}

首先我创建一个文件,然后就写数据入文件中,逻辑看起来没错,但是运行起来,就报错了:IOException: The process cannot access the file 'D:\data.txt' because it is being used by another process.

提示进程正被占用。毫无疑问是我们创建了文件,但是没有释放资源,程序就判断你的资源被占用了。

不懂用using关键字的就感觉比较麻烦了,但是通过使用using,轻松解决。

string path = “D:\data.txt”;
if (!File.Exists(path ))
{using(File.Create(path)){File.WriteAllText(path,"OK");}                  }

事实上using还是有不少用处的。

1、首先是上面案例:它可以管理资源,它会自动释放实现了IDisposable接口的对象,这样可以确保在使用完对象后,及时释放相关资源,避免内存泄漏。事实上,它除了处理一个资源外,它还可以同时处理多个资源,通过逗号分开就行,例如:

using (var stream = new FileStream("file.txt", FileMode.Open))
{// 使用stream对象进行文件操作// 在代码块结束时,stream会自动调用Dispose()方法释放资源
}using (var stream1 = new FileStream("file1.txt", FileMode.Open),stream2 = new FileStream("file2.txt", FileMode.Open))
{// 使用stream1和stream2进行文件操作// 在代码块结束时,两个流对象的资源会被自动释放
}

2、引入命名空间:这个就比较常见了。如:

using System;
using System.IO;namespace MyNamespace
{class MyClass{static void Main(){// 可以直接使用Console和File类,而无需写成System.Console和System.IO.FileConsole.WriteLine("Hello, world!");File.WriteAllText("file.txt", "Hello!");}}
}

3、可以使用using static导入静态类的成员。

using static MyNamespace.MathHelper;namespace MyNamespace
{static class MathHelper{public static int Add(int a, int b){return a + b;}}class MyClass{static void Main(){int result = Add(3, 4); // 直接使用Add方法,无需写成MathHelper.Add}}
}

4、使用别名来简化长命名空间的使用。

比如我觉得System.IO这个命名空间有点长,那么我使用using SysIO = System.IO代替它。

5、自定义类型的资源管理.:当我们编写的自定义类型需要进行资源管理,就可以通过实现IDisposable接口,并在Dispose方法中释放相关资源。这样该自定义类型就可以像标准类型一样使用using语句块进行资源管理。如自定义类:

public class MyResource : IDisposable
{private bool disposed = false;// 实现IDisposable接口的Dispose方法public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!disposed){if (disposing){// 释放托管资源}// 释放非托管资源disposed = true;}}// 如果有非托管资源,还可以实现析构函数(Finalize方法)~MyResource(){Dispose(false);}
}

使用:

using (var resource = new MyResource())
{// 使用resource对象// 在代码块结束时,resource对象的资源会被自动释放
}

6、除此意外,我们还可以结合try~catch语句,捕捉异常。如:

try
{using (var resource = new MyResource()){// 使用resource对象// 可能会抛出异常}
}
catch (Exception ex)
{// 处理异常
}

上面案例中,当发生异常时using语句块会自动调用Dispose方法释放资源,然后异常会被捕获然后在catch块中进行处理。

http://www.lryc.cn/news/241859.html

相关文章:

  • 16 redis高可用读写分离方案
  • Nginx模块开发之http handler实现流量统计(2)
  • 案例012:Java+SSM+uniapp基于微信小程序的科创微应用平台设计与实现
  • vue3+elementPlus登录向后端服务器发起数据请求Ajax
  • 存储区域
  • C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)
  • Redis-Redis高可用集群之水平扩展
  • 2023全球数字贸易创新大赛-人工智能元宇宙-4-10
  • go defer用法_类似与python_java_finially
  • Log4j2.xml不生效:WARN StatusLogger Multiple logging implementations found:
  • 【LeetCode】挑战100天 Day14(热题+面试经典150题)
  • VMware安装windows操作系统
  • 历时半年,我发布了一款习惯打卡小程序
  • 被DDOS了怎么办 要如何应对
  • 时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)
  • 【免费使用】基于PaddleSeg开源项目开发的人像抠图Web API接口
  • Centos7 Python环境和yum修复
  • Ubuntu下使用protoBuf
  • AT89S52单片机
  • 数字孪生智慧校园 Web 3D 可视化监测
  • Python Web框架的三强之争:Flask、Django和FastAPI
  • 本地缓存与分布式缓存
  • LabVIEW如何获取波形图上游标所在位置的数值
  • 八股文面试day6
  • 【Unity】EventSystem.current.IsPointerOverGameObject()对碰撞体起作用
  • 形态学操作—闭运算
  • HEVC-SCC rgb file input
  • XG916Ⅱ轮式装载机后驱动桥设计机械设计CAD
  • pcr扩增原理中的变性 退火 延申扩增
  • C语言——输入一个4位正整数,输出其逆数。