iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#using的本质及使用详解
  • 493
分享到

C#using的本质及使用详解

2024-04-02 19:04:59 493人浏览 独家记忆
摘要

目录01.点明观点02.C#中,using的两个作用03.using如何实现资源释放04.实践探索05.总结01.点明观点 C#中,非托管资源使用之后必须释放,而using()是使用

01.点明观点

C#中,非托管资源使用之后必须释放,而using()是使用非托管资源的最佳方式,可以确保资源在代码块结束之后被正确释放,并且代码更简洁。

这里说的非托管资源指的是实现IDisposable或IAsyncDisposable接口的类。

using是如何实现资源释放?本文将予以解答。

02.C#中,using的两个作用

第一种:引入命名空间

用法如下:

using System.Text;
using s = System.Text;       //为命名空间定义别名
using static System.Math;    //引入类型静态成员
global using System.Math;    //全局引入

第二种:声明一个对象,并确保该对象在代码块执行完之后被释放(Dispose())。

这里主要对第二种用法进行分析。

03.using如何实现资源释放

通常,我们以下面的形式声明一个非托管资源,当代码块执行完之后,资源会自动释放,那程序是如何做到的呢?

using (var file = File.Open("filePath", FileMode.OpenOrCreate))
{
    //do something
}

说起来也简单:

using(...)语句经编译器编译之后,转换了try{...}finally{...}

上面的代码,经程序编译后的代码如下:

FileStream file = File.Open("filePath", FileMode.OpenOrCreate);
try
{
  //do something
}
finally
{
  if (file!= null)
  {
    ((IDisposable)file).Dispose();
  }
}

两段代码的运行结果是一样的,对比之下,很明显,使用using()的代码更简洁。

04.实践探索

实践出真知,我们通过一个例子,使用反编译工具(ILSpy或ILDasm)查看生成的DLL,进行验证。

首先,定义一个实现了IDisposable接口的类。当然也可以使用.net中内置的类,这里采用自定义类是为了验证,只要是实现了IDisposable接口的类,都可以使用这种方式。

然后,使用using创建资源对象。

最后,查看编译后生成的IL代码文件,可以看到确实如上面所说,using(...)语句经编译器编译之后,转换了try{...}finally{...},并且在finally{}中完成了对Dispose()方法的调用。

至此,using()如何完成对非托管资源的释放,就很清楚了。

05.总结

  • using()语句编译后生成 try{...} finally{...} 语句,进而确保资源释放。
  • using()是程序中使用非托管资源的最佳方式。
  • using()的本质是C#中的语法糖。

糖让人快乐,同样语法糖也能让编程变得快乐,类似using()的语法糖,可以简化代码,确保必要逻辑的正确执行;糖只是调味剂,同样语法糖也只是简化编码,核心业务逻辑,还需要开发人员完成。

using的用法很简单,在合适的场景下正确使用,可以让开发工作事半功倍。

以上就是C# using的本质及使用详解的详细内容,更多关于C# using使用的资料请关注编程网其它相关文章!

--结束END--

本文标题: C#using的本质及使用详解

本文链接: https://www.lsjlt.com/news/166679.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#using的本质及使用详解
    目录01.点明观点02.C#中,using的两个作用03.using如何实现资源释放04.实践探索05.总结01.点明观点 C#中,非托管资源使用之后必须释放,而using()是使用...
    99+
    2024-04-02
  • C#using()的使用方法
    目录01.点明观点 02.C#中,using的两个作用 03.using如何实现资源释放 04.实践探索05.总结 01.点明观点 ...
    99+
    2023-02-21
    C# using()
  • C++ 命名空间 using声明使用示例详解
    目录正文最初的c++代码写法正文 c++在开发的过程当中需要使用到库函数,那么基于库函数的使用最初的流程是:1、include 相关的头文件,比如:iostream,string。...
    99+
    2022-12-08
    C++ 命名空间using声明 C++ using声明
  • Swagger及knife4j的基本使用详解
    目录Swagger以及knife4j基本使用Swagger 介绍:Restful 面向资源SpringBoot使用swaggerKnife4j --Swagger增强工具Swagge...
    99+
    2024-04-02
  • 【C/C++与MySql的连接及使用详解】
    文章目录 概要:本期主要讲解C或者C++怎么在程序中连接MySql数据库。主要步骤一、MySql的链接库二、项目环境配置三、项目内调用MySql类进行数据库操作1.准备工作2.连接数据库3.数据库建表4.向表中插入数据5.查询表中数...
    99+
    2023-08-20
    mysql c语言 c++
  • C++ 函数模板详解:泛型编程的本质解析
    函数模板是 c++++ 中的泛型编程特性,允许创建通用的函数以处理不同类型参数,提高代码灵活性、可重用性和简洁性:定义:函数模板提供函数签名,使用类型参数指定函数操作的数据类型。使用:通...
    99+
    2024-04-26
    c++ 函数模板
  • C++ 函数继承详解:多态的本质是什么?
    函数继承概述:c++++中函数继承通过override关键字实现,允许子类覆盖父类函数,使多态成为可能,即对象在运行时表现出不同的行为,即使属于同一父类。 C++ 函数继承详解:多态的...
    99+
    2024-05-04
    多态 c++ 函数继承 c++
  • C#泛型的使用及示例详解
    目录一、什么是泛型二、为什么使用泛型三、泛型类型参数四、泛型类五、泛型约束六、泛型的协变和逆变七、泛型缓存这篇文章主要讲解C#中的泛型,泛型在C#中有很重要的地位,尤其是在搭建项目框...
    99+
    2024-04-02
  • C++11中使用using的方法
    在 C++ 中 using 用于声明命名空间,使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后,就可以直接使用命名空间中的定义的类了。在 C++11 中赋予了 using ...
    99+
    2024-04-02
  • C++详细分析lambda表达式的本质
    例: stable_sort(words.begin(), words.end(), [](const string& s1, const string& s2...
    99+
    2024-04-02
  • C#中Foreach循环遍历的本质与枚举器详解
    目录前言1、创建一个控制台应用程序2、编写测试代码并分析3、总结前言 对于C#里面的Foreach学过 语言的人都知道怎么用,但是其原理相信很多人和我一样都没有去深究。刚回顾泛型讲到...
    99+
    2024-04-02
  • Java接口回调的本质详解
    本质是JVM指令invokevirtual它涉及到了多态的特性,使用 virtual dispatch 做方法调用 virtual dispatch 机制会首先从 receiver(...
    99+
    2024-04-02
  • C#中using word的使用方法
    这篇文章主要介绍“C#中using word的使用方法”,在日常操作中,相信很多人在C#中using word的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中using word的使用方法”的疑...
    99+
    2023-06-17
  • 详解Spring Data JPA使用@Query注解(Using @Query)
    经过几天的折腾,终于到了学习一个重量级的查询方式上,使用@Query注解,使用注解有两种方式,一种是JPQL的SQL语言方式,一种是原生SQL的语言,略有区别,后者我们更熟悉一些。话不多说,看代码。1、在CustomerRepository...
    99+
    2023-05-31
    spring data jpa
  • C++的using声明和using编译指令怎么使用
    这篇文章主要介绍“C++的using声明和using编译指令怎么使用”,在日常操作中,相信很多人在C++的using声明和using编译指令怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++的usi...
    99+
    2023-06-22
  • KotlinFlow操作符及基本使用详解
    目录一、Flow的基本概念二、Flow的生命周期与异常处理2.1 开始与结束2.2 异常的处理2.3 retry的处理2.4 超时的处理2.5 Flow的取消三、Flow的创建方式四...
    99+
    2024-04-02
  • C++中map和set的简介及使用详解
    目录关联式容器键值对setset的介绍set的使用multisetmapmap的介绍map的使用map构造map的插入map的[ ]运算符重载multiset关联式容器 关联式容器包...
    99+
    2024-04-02
  • rapidxml的详解及使用
    RapidXML是一个用于解析和操作XML文档的C++库。它提供了一组简单而高效的API,可以快速解析和访问XML数据。使用Rapi...
    99+
    2023-09-01
    rapidxml
  • Android IdleHandler基本使用及应用案例详解
    目录IdleHandler基本使用案例1:执行GC案例2:粗估Activity界面渲染时间案例3:App大图监测案例4:延迟启动初始化任务IdleHandler基本使用 IdleHa...
    99+
    2022-11-13
    Android IdleHandler使用 Android IdleHandler
  • docker基本命令及使用实例详解
    目录docker基本命令docker文件系统commit镜像容器数据卷具名和匿名挂载初识Dockerfile commitDockerfile 构建过程发布自己的镜像docker网络...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作