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块中进行处理。
相关文章:
C# 中using关键字的使用
在C#中我们还是很有必要掌握using关键字的。 比如这样: string path “D:\data.txt”; if (!File.Exists(path )) {File.Create(path); File.WriteAllText(path,"OK"); } 首先我创建…...
16 redis高可用读写分离方案
在前面说的JedisSentinelPool只能实现主从的切换,而无法实现读写的分离。 1.哨兵的客户端实现主从切换方案 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</arti…...
Nginx模块开发之http handler实现流量统计(2)
文章目录 一、概述二、Nginx handler模块开发2.1、代码实现2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 总结 一、概述 上一篇【Nginx模块开发之http handler实现流量统计(1)】使用数组在单进程实现了IP的流量统计&a…...
案例012:Java+SSM+uniapp基于微信小程序的科创微应用平台设计与实现
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...
vue3+elementPlus登录向后端服务器发起数据请求Ajax
后端的url登录接口 先修改main.js文件 // 导入Ajax 前后端数据传输 import axios from "axios"; const app createApp(App) //vue3.0使用app.config.globalProperties.$http app.config.globalProperties.$http axios app.mount(#app); login.vue 页面显示部分…...
存储区域
将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并在内存中为这些段分配空间。 栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。 进…...
C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)
前言 我们在开发串口通信程序时,有时候会遇到比如单片机或者传感器发送的数据速度特别快,比如10ms、20ms发送一次,并且每次发送的数据量还比较大,如果按照常规的写法,我们会发现接收的数据还没处理完,新的数据又发送过来了,这就会导致处理数据滞后,软件始终处理的不是…...
Redis-Redis高可用集群之水平扩展
Redis3.0以后的版本虽然有了集群功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,今天就来带大家看看redis高可用集群如何做水平扩展,原始集群(见下图)由6个节点组成,6个节点分布在三…...
2023全球数字贸易创新大赛-人工智能元宇宙-4-10
目录 竞赛感悟: 创业的话 好的项目 数字工厂,智慧制造:集群控制的安全问题...
go defer用法_类似与python_java_finially
defer 执行 时间 defer 一般 定义在 函数 开头, 但是 他会 最后 被执行 A defer statement defers the execution of a function until the surrounding function returns. 如果说 为什么 不在 末尾 定义 defer 呢, 因为 当 错误 发生时, 程序 执行 不到 末尾 就会 崩溃. d…...
Log4j2.xml不生效:WARN StatusLogger Multiple logging implementations found:
背景 将 -Dlog4j.debug 添加到IDEA的类的启动配置中 运行上图代码,这里log4j2.xml控制的日志级别是info,很明显是没生效。 DEBUG StatusLogger org.slf4j.helpers.Log4jLoggerFactory is not on classpath. Good! DEBUG StatusLogger Using Shutdow…...
【LeetCode】挑战100天 Day14(热题+面试经典150题)
【LeetCode】挑战100天 Day14(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-162.1 题目2.2 题解 三、面试经典 150 题-163.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&…...
VMware安装windows操作系统
一、下载镜像包 地址:镜像包地址。 找到需要的版本下载镜像包。 二、安装 打开VMware新建虚拟机,选择用镜像文件。将下载的镜像包加载进去即可。...
历时半年,我发布了一款习惯打卡小程序
半年多前,我一直困扰于如何记录习惯打卡情况,在参考了市面上绝大多数的习惯培养程序后,终于创建并发布了这款习惯打卡小程序。 “我的小日常打卡”小程序主要提供习惯打卡和专注训练功能。致力于培养用户养成一个个好的习惯,改掉…...
被DDOS了怎么办 要如何应对
DDoS攻击的特点和类型 1. 特点 DDoS攻击的特点是通过大量合法的请求或者无效的请求,消耗目标服务器的网络带宽和系统资源,使其无法正常运行。攻击者通常使用多个主机发起攻击,以达到更高的攻击效果。 2. 常见类型 (1)S…...
时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)
一、本文介绍 本文给大家带来的实战内容是利用PyTorch实现LSTM-GRU模型,LSTM和GRU都分别是RNN中最常用Cell之一,也都是时间序列预测中最常见的结构单元之一,本文的内容将会从实战的角度带你分析LSTM和GRU的机制和效果,同时如果你…...
【免费使用】基于PaddleSeg开源项目开发的人像抠图Web API接口
基于PaddleSeg开源项目开发的人像抠图API接口,服务器不存储照片大家可放心使用。 1、请求接口 请求地址:http://apiseg.hysys.cn/predict_img 请求方式:POST 请求参数:{"image":"/9j/4AAQ..."} 参数是jso…...
Centos7 Python环境和yum修复
1、删除现有残余包 [rootlocalhost ]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# whereis python |xargs rm -frv[rootlocalhost ]# whereis python ##验证清除&…...
Ubuntu下使用protoBuf
一、protobuf简介: 1.1 protobuf的定义: protobuf是用来干嘛的? protobuf是一种用于 对结构数据进行序列化的工具,从而实现 数据存储和交换。 (主要用于网络通信中 收发两端进行消息交互。所谓的“结构数据”是指类…...
AT89S52单片机
目录 一.AT89S52单片机的硬件组成 1.CPU(微处理器) (1)运算器 (2)控制器 2.数据存储器 (RAM) (1)片内数据存储器 (2)片外数据存储器 3.程序存储器(Flash ROM) 4.定时器/计数器 5.中断系统 6.串行口 7.P0口、P1口、P2口和P3口 8.特殊功能寄存器 (SFR) 常用的特殊功…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
