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.File
            Console.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块中进行处理。

相关推荐
dialect_28 分钟前
KMP算法
开发语言·c++·算法
总要学点什么1 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
开开心心_Every3 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c3 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
吴卫斌3 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
超级架构师4 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮5 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔5 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真6 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放6 小时前
Python基础语法练习题(75)
开发语言·python·学习