C#1.0-11.0所有历史版本主要特性总结

文章目录
  • 前言
  • 名词解释
  • 主要版本一览表
  • 各版本主要特性一句话总结
    • C# 1.0 (Visual Studio 2002, .Net Framework 1.0)
    • C# 2.0 (Visual Studio 2005, .Net Framework 2.0)
    • C# 3.0 (Visual Studio 2008, .Net Framework 3.0)
    • C# 4.0 (Visual Studio 2010, .Net Framework 4)
    • C# 5.0 (Visual Studio 2012, .Net Framework 4.5)
    • C# 6.0 (Visual Studio 2015, .Net Framework 4.6)
    • C# 7.0 (Visual Studio 2017, .Net Framework 4.7)
    • C# 8.0 (Visual Studio 2019 .Net Framework 4.8)
    • C# 9.0 (Visual Studio 2019, .Net 5.0)
    • C# 10 (Visual Studio 2022, .Net 6.0)
    • C# 11 (Visual Studio 2022, .Net 7.0)
    • C# 12 (Visual Studio 2022,.Net 8.0)
  • 日志
  • 参考资料

前言

从2002年.Net平台发布开始,C#已经从1.0更新到了现在的8.0。目前网上有很多文章对这些版本的主要更新内容进行了总结,但是大都是内容的简单翻译和资料堆叠。本文根据自己的使用体验,在现有总结的基础上进行内容丰富细化,以便于读者能够对C#的语言特性有更加详细深刻的认识和理解。

自从上世纪90年代Java火了以后,微信就想做自己的Java,于是从1998年开始就制定了.NET计划,并于2002年正式发布。而C#就是.NET平台开发的首发语言,其主要参考对象为Java(熟悉这两门语言的朋友会发现两者有非常多的相似性),并结合VC6.0的界面设计方式、MFC的类库等为一体,整合而来。从C#1.0语言诞生开始,微软就不断为其添砖加瓦,丰富其功能。使其始终保持活跃的生命力。

名词解释

  • C# 一门专门为 .NET 而推出的编程开发语言,对应Java
  • .NET Framework C#的运行环境,对应 JDK。
  • .Net 微软从C#9开始,将其真正开源做跨平台,包括5,6,7,8等版本。
  • Visutal Studio 开发环境即IDE,对应 Eclipse。

主要版本一览表

C# 版本发布时间对应 .Net 框架版本对应Visual Studio版本
C# 1.02002.01.NET Framework 1.0/1.1Visual Studio 2002
C# 2.02005.11.NET Framework 2.0Visual Studio 2005
C# 3.02007.11.NET Framework 3.0/3.5Visual Studio 2008
C# 4.02010.04.NET Framework 4.0Visual Studio 2010
C# 5.02012.08.NET Framework 4.5Visual Studio 2012
C# 6.02015.07.NET Framework 4.6Visual Studio 2015
C# 7.02017.03.NET Framework 4.7.1~4.7.3Visual Studio 2017
C# 8.02019.09.NET Framework 4.8Visual Studio 2019
C# 9.02020.11.NET 5 (跨平台统一命名)Visual Studio 2020
C# 10.02021.11.NET 6Visual Studio 2022
C# 11.02022.11.NET 7Visual Studio 2022
C# 12.02023.11.NET 8Visual Studio 2022

我们在新建项目的时候所要选择的就是.NET Framework的版本号。如下图所示:
在这里插入图片描述

各版本主要特性一句话总结

C# 1.0 (Visual Studio 2002, .Net Framework 1.0)

回过头来看看,C#1.0版本看起来很像Java。当时的设计目标是成为一种“简单,现代,通用的面向对象语言”。 当时,看起来像Java意味着它实现了那些早期的设计目标。但如果现在回顾一下C#1.0,你会发现它的功能很弱:缺乏内置的异步功能和一些我们认为理所当然的泛型功能。 比如,没有泛型、LINQ、Lambda表达式。与今天相比,C#版本1.0看起来被剥夺了功能。 你会发现自己编写了一些冗长的代码。 但是,你必须从某个地方开始。这个版本的特性就不列出来了,可以理解为最开始的基本功能的C#。如果没有后面微软的不断更新,则不会有C#的今天,因为它很快就会被更多的语言替代而被人遗忘。

C# 2.0 (Visual Studio 2005, .Net Framework 2.0)

微软在 Studio 2005 中发布了C#2.0。在此版本中,主要引入了很多新特性(比如非常重要的泛型),以帮助开发人员以更通用的方式编写应用程序代码。 以下是C#2.0引入的新功能:

  • Generics
    泛型,如经常使用的 List<String> list = new List<String>();
  • Partial types
    分部类型,可以将类、结构、接口等类型定义拆分到多个文件中,如在窗体设计类中,就有两个文件 Form.cs 和 Form.designer.cs 将业务逻辑和界面设计分离
  • Anonymous methods
    匿名方法,即可以在不定义函数名称和参数列表的情况直接定义函数,主要的使用是方便调用代理。
  • Iterators
    迭代器,即 foreach 语法
  • Nullable types
    可以为Null的类型,该类可以是其它值或者null,便于空值的判断
  • Getter/setter separate accessibility
    属性访问和设置权限分享,即可以分别设置getter 和 setter 的可访问性。
  • Method group conversions (delegates)
    方法组转换,可以将声明委托代表一组方法,隐式调用
  • Co- and Contra-variance for delegates and interfaces
    委托、接口的协变和逆变,主要用于扩大委托的定义范围,具体参见文章:快速理解C#委托中的协变与逆变。
  • Static classes
    静态类,即可以定义一个类为 static,从而保证其唯一性
  • Delegate inference
    委托推断,允许将方法名直接赋给委托变量,从而简化操作

C# 3.0 (Visual Studio 2008, .Net Framework 3.0)

  • Implicitly typed local variables
    可以使用var关键字,如 var s = "tom",从而不用在定义时明确指定数据类型,方便使用。
  • Object and collection initializers 对象和集合初始化器
    对象初始化器:Person tom = new Person(){ ID = 0, Name = "Tom"};
    集合初始化器:List<string> names = { "Tom", "Jack", "Lucy"};
  • Auto-Implemented properties 自动属性,自动生成属性方法,声明更简洁
    示例: public string Name{get;set;}
  • Anonymous types 匿名类型
    示例:先定义 var tom= new { ID = 0, Name = "Tom" }; 再使用 Console.WriteLine($"Name = {tom.Name}");
  • Extension methods:扩展方法
    即可以给一个已经封装好的类添加新的方法(注意:不是派生)。
  • Query Expressions
    查询表达式提供了两种全新的表达语言:Lambda 表达式 和 表达式树(Expression trees)。其中,表达式树是以树形数据结构表示代码,是一种新数据类型,具体参见:表达式树。表达式树存在的主要目的就是可以根据需求的不同从而动态修改表达式树中的表达式以便生成可在非C#环境执行的代码。
  • Partial methods
    在C#2.0中引入了类,其目的是实现前台和后台的分离。但是在实际应用中,有时候一些方法仍然需要前后台的人员进行共同合作才能解决。为了处理这个问题,引入了分部方法,即可以在一个部分类中引入声明,在另一个相同的分部类中进行定义。如下所示:
    定义部分:public partial class Form1: Form { partial void method();}
    实现部分:partial class Form1: Form { partial void method (){ Console.WriteLine("Partial method");}
    即便没有实现,编译的时候也可以正常通过,以方便设计和开发人员。

C# 4.0 (Visual Studio 2010, .Net Framework 4)

  • Dynamic binding
    C#3.0 提供了 var 关键字,可以自动推断数据类型,4.0 又提供了一个看上去类似的 dynamic。这个关键字也是用于定义对象,并且也不需要知道数据类型,即可调用对象的方法,但是区别在于 var 是根据上下文推断数据类型,然后再调用,而 dynamic 是不对类型进行检测,即便对象是 object 类型,调用一个未知的方法也不会报错。因为它会在程序运行时,真正执行到所在行的时候才会进行判断,如果对象中有调用的方法,则正常调用,否则就会报错,具体可以参见: C#中dynamic的正确用法。
  • Named and optional arguments
    中文翻译为:具名参数和可选参数。
    可选参数:即为参数加上默认值,如 void show(string msg="info"){ Console.WriteLine(msg);},在调用时可以不写参数,即:show(),此时 msg 的值为 info
    具名函数:若可选参数的函数定义为:int add(int x = 1, int y),那么在调用时第1个省略后就会报错,所以可以使用具名函数调用,调用方法为:add(y:5);,此时 x 为默认值,y 为 5。
    即具体可以参见这篇文章:C#中的 具名参数 和 可选参数。
  • Generic co- and contravariance
    泛型的协变和逆变,原理同C#2.0委托、接口的协变和逆变。
  • Embedded interop types (“NoPIA”)
    中文翻译为:嵌入互操作类型。表示嵌入类型信息,增加引用COM组件程序的中立性,主要用于COM模块的调用。具体可以参阅这篇文章:C# 嵌入互操作类型。

C# 5.0 (Visual Studio 2012, .Net Framework 4.5)

  • Asynchronous methods
    用于多线程编程,可以异步调用方法,请参阅:C#异步编程方式以及示例。
  • Caller info attributes
    调用方信息特性。主要作用是可以显示调用函数的名称、所在文件和所在行的信息。基主要目的是为了便于调试。具体可以参见这篇文章:http://www.itstrike.cn/Question/99a193ca-e99a-45ba-99f1-1f38017313db
  • 其他
    实际上5.0的新特性肯定不会只有两条,但是了由于特性不是很明显,于是就不再详细介绍,具体可以参见:C# 5.0五大新特性。

C# 6.0 (Visual Studio 2015, .Net Framework 4.6)

  • Import of static type members into namespace
    用于简化书写。在引用类名后,可以直接使用类的静态成员,比如在使用 using static System.String; 后,可以将 String.IsNullOrEmpty(str) 可以直接写成 IsNullOrEmpty(str)
  • Exception filters
    异常过滤器,即在异常的时候可以进行删除,比如定义一个变量 int level;,那么在可以使用这样的语法:
    try{
      doSomething();
    } catch(Exception e) when (level == 10){
      ProcessException(e);
    } 
    这样,只有在 level == 10 的时候,才会进行异常处理。
  • Await in catch/finally blocks
    支持在catch/finally语句块使用await语句进行异常调用 。
  • Auto property initializers
    自动属性的初始化。这个非常好用,可以在定义属性时直接赋值,比如 public string Name { get; set; } = "no name";
  • Default values for getter-only properties
    即给只读属性设置默认值,如 public string Name { get; } = "no name";
  • Expression-bodied members
    表达式主体成员指的是仅以表达式定义的成员。举例来说:一个类中有个 public string Name {get; set} 属性,在 ToString() 方法重写的时候,我们需要以下格式:
    public override string ToString() { return $"{Name}".Trim();}
    现在优化后,同样也可以使用 Lambda 的操作符号 => 进行简化,简化后为:
    public override string ToString() => $"{Name}".Trim();
    注:当代码有多行的时候,使用一对花括号分隔,但是右花括号后要以分号结束。
  • Null propagator (null-conditional operator, succinct null checking)
    Null条件操作符,用法有两种:
    1)非空时才调用,如 obj?.ToString(); ,如果 obj 不为空,则执行 obj.ToString();,否则跳过不执行此行。相当于 if(obj != null) obj.ToString();
    2)string s = obj ?? obj.ToString(); ,作用同上。
  • String interpolation
    字符串插入拼接。用于简化字符串的拼接。这个超级好用,比如说: string s1 = "John", s2 = "Corner"; 如果想得到 "Jone Corner",原来的方法要么拼接,即 s1 + " " + s2,要么使用 String.Format。新方法很简单:$"{s1} {s2}",实际上就是对String.Format的简化,而且在 {}中非常强大,可以所有常规的表达式,甚至直接支持双引号,比如: $"{DateTime.Now.ToString("yyyy/MM/dd")}" 输出为 2019/08/28
  • nameof operator
    新加入的关键字 nameof,用于返回方法、属性、变量的名称,如 string name = nameof(String.Format);,返回 Format。很多时候,我们如果直接使用字符串,当名称变更的时候会不好用,而使用了 nameof 的时候,可以直接与方法、属性、变量等名称关联,即便这个变量的名称发生变化了,使用 nameof 以后,也会跟着一起变化,这个在动态编辑时很有用。
  • Dictionary initializer
    字典初始化。格式如下所示:
    var moreNumbers = new Dictionary<int, string>
    {
      {19, "nineteen" },
      {23, "twenty-three" },
      {42, "forty-two" }
    };

C# 7.0 (Visual Studio 2017, .Net Framework 4.7)

  • Out variables
    可以在out后面直接声明变量,例如前TryParse需要先定义再使用的两行的代码,现在一行即可: int.TryParse(s, out int num),从而简化语法。
  • Pattern matching
    数据类型转换的语法糖。可以在类型判断同时定义符合的变量。如变量 object obj,判断其是否是int,并进行求和。
    之前的写法:if (obj is int) sum += (int)obj;
    C# 7的写法:if (item is int val) sum += val;
    由以可见,在判断时自动定义了转换好的值,从而简化代码。除了 if 语句,在 switch 语句中也同样适用。
  • Tuples
    元组改进,可以为无组添加名称,用法:
    方式1:定义:(int one, int two) tuple = (1, 2); 使用: WriteLine($"first:{tuple.one}, second:{tuple.two}");
    方式2:定义:var tuple2 = (one: 1, two: 2); 使用: WriteLine($"first:{tuple2.one}, second:{tuple2.two}");
  • Deconstruction
    可以从一个类的构造函数中提取相应的数据,比如:var (Name, Age) = new Person(Name, Age);
  • Local Functions
    在函数中定义子函数,子函数体放在 return 后面。这个相关于C++中的inline,用于提高效率,一般非性能场合不推荐使用,因为它不仅影响了程序的阅读性,而且也不利于代码管理。
  • Binary Literals
    二进制使用 0b表示,如 var one= 0b000_0001;
  • Digit Separators
    在数字中使用下划线作为分隔符,这个是为了增强代码的可读性。例如,1000000,可以写成 1_000_000。
  • Ref returns and locals
    对ref引用进行了加强,现在可以引用一个方法中的局部变量,语法是:在方法定义前加上 ref,同时在返回时也加上ref,如定义函数ref int GetDataRef(int[] data, int index){ return ref data[index];} ,则 ref int num = ref GetDataRef(new data[]{1,2,3}, 0); 返回,对数组中第0个元素的引用。
  • Generalized async return types
    如名称所示,现在泛型也支持async。
  • More expression-bodied members
    进一步丰富C#6中的表达式成员的功能,允许构造器、解析器、属性可以使用表达式作为body。比如属性:
    public string Name{ get => name; set => name = value ?? "noname";}
  • Throw expressions
    Throw可以抛出表达式中。如果表达式成立,则抛出表达式的值,类型为System.Exception,如果值为 null,则抛出System.NullReferenceException。

更多:下面是 7.1-7.3在更新的一些属性,仅供参考。

  • C# 7.1 特征 (Visual Studio 2017 version 15.3)
    Async main:在main方法用async方式
    Default expressions:引入新的字面值default
    Reference assemblies:
    Inferred tuple element names:
    Pattern-matching with generics:
  • C# 7.2 特征 (Visual Studio 2017 version 15.5)
    Span and ref-like types
    In parameters and readonly references
    Ref conditional
    Non-trailing named arguments
    Private protected accessibility
    Digit separator after base specifier
  • C# 7.3 (Visual Studio 2017 version 15.7)
    重载解析
    泛型约束:枚举、委托和非托管
    隐藏字段的Attribute
    元组比较(==和!=)
    栈分配Span
    可重新赋值的Ref局部变量
    初始化器中的表达式变量
    栈分配数组

C# 8.0 (Visual Studio 2019 .Net Framework 4.8)

参考网页 官网:C# 8.0 中的新增功能

  • Readonly 成员 参考
    添加了readonly关键字的函数,不能修改类内成员,从而保证数据的只读性。如以下代码会报错。
public struct Vector2{public float x,y;  public readonly float GetLengthIllegal(){var tmp = MathF.Sqrt(LengthSquared); x = tmp;    // Compiler error, cannot write xy = tmp;    // Compiler error, cannot write y return tmp;}
}
  • 默认接口方法

  • 模式匹配增强功能:

  • Switch 表达式

  • 属性模式

  • 元组模式

  • 位置模式

  • Using 声明

  • 静态本地函数

  • 可处置的 ref 结构

  • 可为空引用类型 ref
    增加了可空类型,使用 type? 表示,如 string? 表示可空字符串。好处就是string? 可能为空,而 string 就一定不为空,这样可以省去判断。

  • 异步流

  • 异步可释放

  • 索引和范围

  • Null 合并赋值

  • 非托管构造类型

  • 嵌套表达式中的 Stackalloc

  • 内插逐字字符串的增强功能

参考:官网

C# 9.0 (Visual Studio 2019, .Net 5.0)

参考网页 官网:C# 9.0 中的新增功能

  • 记录
  • 仅限 Init 的资源库
  • 顶级语句
  • 模式匹配增强功能
  • 性能和互操作性
    • 本机大小的整数
    • 函数指针
    • 禁止发出 localsinit 标志
  • 调整和完成功能
    • 目标类型的 new 表达式
    • static 匿名函数
    • 目标类型的条件表达式
    • 协变返回类型
    • 扩展 GetEnumerator 支持 foreach 循环
    • Lambda 弃元参数
    • 本地函数的属性
  • 支持代码生成器
    • 模块初始值设定项
    • 分部方法的新功能

C# 10 (Visual Studio 2022, .Net 6.0)

参考网页 官网:C# 10.0 中的新增功能

  • 记录结构
  • 结构类型的改进
  • 内插字符串处理程序
  • 指令
  • 文件范围的命名空间声明
  • 扩展属性模式
  • 对 Lambda 表达式的改进
  • 可使用 内插字符串
  • 记录类型可密封
  • 改进型明确赋值
  • 在同一析构中可同时进行赋值和声明
  • 可在方法上使用 属性
  • CallerArgumentExpression 属性
  • 增强的 pragma

C# 11 (Visual Studio 2022, .Net 7.0)

主要功能特性

  • 原始字符串字面量
    注: 左引号之后、右引号之前的换行符不包括在最终内容中
string longMessage = """This is a long message.It has several lines.Some are indentedmore than others.Some should start at the first column.Some have "quoted text" in them.""";
  • 泛型数学支持
  • 泛型属性
  • UTF-8 字符串字面量
  • 字符串内插表达式中的换行符
  • 列表模式
  • 文件本地类型
  • 必需的成员
  • 自动默认结构
  • 常量 string 上的模式匹配 Span
  • 扩展的 nameof 范围
  • 数值 IntPtr
  • ref 字段和 scoped ref
  • 改进了方法组向委托的转换
  • 警告波

PS. 从 .NET 6.0.200 SDK 或 Visual Studio 2022 版本 17.1 开始,可以试用 C# 中的预览功能。
参考网页 官网:C# 11.0 中的新增功能

C# 12 (Visual Studio 2022,.Net 8.0)

主构造函数
默认 Lambda 参数
任何类型的别名
内联数组
侦听器

参考: 官网链接

日志

  • 2023/08/01 更新部分错误并优化文档
  • 2022/05/02 添加 11.0

参考资料

  • Expression-bodied 成员(C# 编程指南), 微软官方, 2017.
  • VS2017十五项新功能体验, Leo_wl, 2017.
  • 带你玩转Visual Studio——VS2015的新功能和特性
  • 详解C#7.0新特性, CNXY, 2017-10.
  • C# Version History, TutorialsTeacher.com, 2019.
  • 文章链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DataWhale - 吃瓜教程学习笔记(三)

学习视频&#xff1a;第3章-对数几率回归_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 3.3 对数几率回归 sigmoid函数 极大似然估计建模 信息论 以概率论、随机过程为基本研究工具&#xff0c;研究广义通信系统的整个过程 - 信息熵 &#xff08;信息期望&#xff09; 度…

Windows bat 提取多个目录下的文件,到一个目录

批处理命令 echo off setlocalrem 设置源目录和目标目录 set "sourceDirE:\motrix" set "targetDirE:\新建文件夹"rem 创建目标目录&#xff0c;如果不存在 if not exist "%targetDir%" mkdir "%targetDir%"rem 循环遍历源目录中的所…

TCP:TCP连接的建立与终止

TCP连接的建立与终止 建立连接第一次握手第二次握手第三次握手 终止连接第一次挥手第二次挥手第三次挥手第四次挥手 T C P是一个面向连接的协议。无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。本文将详细讨论一个T C P连接是如何建立的以及通信…

2024年能源电力行业CRM研究报告

中国能源电力行业属于大制造业的重要组成部分&#xff0c;在国民经济中的地位举足轻重。据统计&#xff0c;近十年来能源电力行业的整体投资呈现出增长趋势&#xff0c;尤其是“十四五”期间增长显著&#xff0c;2022年全国主要电力企业共完成投资12470亿元&#xff0c;同比增长…

【乐吾乐2D可视化组态编辑器】连线

1 连线的绘制 1.1 钢笔绘制连线 1.1.1 曲线、线段、直线、脑图曲线 开始&#xff1a;单击左键 暂停&#xff1a;单击右键 或 enter 结束&#xff1a;esc 乐吾乐2D可视化组态编辑器demo&#xff1a;https://2d.le5le.com/ 1.1.2 横线 按下快捷键shift,点击鼠标左键绘制…

101.6k星的后台巨擘:一站式SaaS多租户、商城、CRM、ERP解决方案

RuoYi-Vue Pro,一个丰富优化重构的后台管理系统,为企业提供了一个强大、灵活、易用的解-决方案。 特点 丰富的功能支持:包括RBAC动态权限、数据权限、SaaS多租户、工作流、三方登录、支付、短信等。 现代化的技术栈:基于Spring Boot、MyBatis Plus、Vue & Element,支持…

在UE中创建命名管道之创建UE蓝图类

需求 在实际工作遇到了需要 UE 开发进程间通信相关的需求。 经过思考后选择使用命名管道来实现 。 名词概念 首先什么是进程间通信: 进程间通信&#xff08; Inter-Process Communication&#xff0c;IPC&#xff09;是指在操作系统中&#xff0c;不同进程之间进行数据交换…

大厂面试官问我:Redis内存淘汰,LRU维护整个队列吗?【后端八股文四:Redis内存淘汰策略八股文合集】

往期内容&#xff1a; 大厂面试官问我&#xff1a;Redis处理点赞&#xff0c;如果瞬时涌入大量用户点赞&#xff08;千万级&#xff09;&#xff0c;应当如何进行处理&#xff1f;【后端八股文一&#xff1a;Redis点赞八股文合集】-CSDN博客 大厂面试官问我&#xff1a;布隆过滤…

精选:15款顶尖Python知识图谱(关系网络)绘制工具,数据分析的强力助手

知识图谱&#xff08;关系网络&#xff09;可以用简单的形状和线条显示复杂的系统&#xff0c;帮助我们理解数据之间的联系。我们今天将介绍15个很好用的免费工具&#xff0c;可以帮助我们绘制网络图。 NetworkX NetworkX是一个用于处理网络的Python工具。许多人在Python中处…

模型选择、过拟合与欠拟合

一、训练误差与泛华误差 1、在训练时&#xff0c;我们关心的是泛化误差&#xff0c;也就是对新数据的预测 2、训练误差&#xff1a;模型在训练数据上的误差&#xff1b;泛化误差&#xff1a;模型在新数据上的误差 二、验证数据集与测试数据集 1、验证数据集&#xff1a;用于…

Percona Toolkit 神器全攻略(配置类)

Percona Toolkit 神器全攻略&#xff08;配置类&#xff09; Percona Toolkit 神器全攻略系列共八篇&#xff0c;前文回顾&#xff1a; 前文回顾Percona Toolkit 神器全攻略Percona Toolkit 神器全攻略&#xff08;实用类&#xff09; 全文约定&#xff1a;$为命令提示符、gr…

Rocketmq在单节点情况下新增从节点

Rocketmq在单节点情况下新增从节点 在docker-compose部署rocketmq单节点的基础上&#xff0c;新增一个从节点 一&#xff0c;修改docker-compose配置文件 原docker-compose文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:server-4.5.2container_name: rm…

选择诊所管理系统的原则是什么?

如今&#xff0c;诊所管理系统已成为医疗机构提升管理效率、优化患者服务的重要工具。然而&#xff0c;市场上的诊所管理系统琳琅满目&#xff0c;功能各异&#xff0c;因此&#xff0c;如何选择一款适合自己诊所的管理系统&#xff0c;是许多诊所管理者需要思考的问题。下面&a…

进程调度的基本过程

文章目录 CPU执行指令过程进程PCB“分时复用” ☁️结语 CPU执行指令过程 一个CPU能执行那些指令&#xff0c;可以认为是cpu最初设计的时候就已经写死了。有一个“表格”描述了都有哪些指令。 以上的表格只是一个简化版本&#xff0c;真实的cpu指令表要复杂很多。此处假设每个…

薄冰英语语法学习--名词2-格

名词后面 s&#xff0c;代表后面这个东西属于前面的。 比如toms book&#xff0c;汤姆的书。 末尾是s&#xff0c;那么直接在最后加就行了。比如boys&#xff0c;男孩们的 表示几个词共同 的所有关系在最后一个词的词尾加 sMary and Toms books 玛丽和汤姆共有的书表示几个词…

深入探讨C++的高级反射机制

反射是一种编程语言能力&#xff0c;允许程序在运行时查询和操纵对象的类型信息。它广泛应用于对象序列化、远程过程调用、测试框架、和依赖注入等场景。 由于C语言本身的反射能力比较弱&#xff0c;因此C生态种出现了许多有趣的反射库和实现思路。我们在本文一起探讨其中的奥秘…

DOM遍历

DOM 遍历是指在 HTML 文档中导航和定位元素的过程。通过 DOM 遍历&#xff0c;您可以在文档中移动并查找特定的元素&#xff0c;以便对其进行操作或者检索信息。 寻找子元素 //DOM遍历 const h1 document.querySelector(h1);//寻找子元素 console.log(h1.querySelectorAll(.…

从入门到精通:使用Python的Watchdog库监控文件系统的全面指南

从入门到精通&#xff1a;使用Python的Watchdog库监控文件系统的全面指南 引言Watchdog库概述核心组件工作原理 快速开始&#xff1a;设置Watchdog安装Watchdog创建一个简单的监控脚本设置和启动Observer 事件处理&#xff1a;如何响应文件系统的变化基本事件处理处理复杂的场景…

论文生成新纪元:探索顶尖AI写作工具的高效秘诀

在学术探索的征途中&#xff0c;AI论文工具本应是助力前行的风帆&#xff0c;而非让人陷入困境的漩涡。我完全理解大家在面对论文压力的同时&#xff0c;遭遇不靠谱AI工具的沮丧与无奈。毕竟&#xff0c;时间可以被浪费&#xff0c;但金钱和信任却不可轻弃。 作为一名资深的AI…

Java使用Graphics2D画图,画圆,矩形,透明度等实现

背景 如上图&#xff0c;需要使用Java生成一个图片&#xff0c; 并以base64编码的形式返回给前端展示。 使用Graphics2D类&#xff0c;来进行画图&#xff0c;其中需要画方框、原型、插入图标、写入文字等&#xff0c;同时需要设置透明度等细节点 环境&#xff1a;Jdk17&#…