C++智能指针详解
C++智能指针详解
目录
- 智能指针概述
- 为什么需要智能指针
- C++标准库中的智能指针
- std::unique_ptr
- std::shared_ptr
- std::weak_ptr
- 智能指针的实际应用
- 智能指针的最佳实践
- 总结
智能指针概述
智能指针是C++中用于自动管理动态分配内存的对象,它们遵循RAII(资源获取即初始化)原则,在对象生命周期结束时自动释放所管理的资源。智能指针的主要目的是解决传统裸指针容易造成的内存泄漏和悬挂指针等问题。
C++11标准引入了三种智能指针:std::unique_ptr
、std::shared_ptr
和std::weak_ptr
,它们都定义在<memory>
头文件中。每种智能指针都有其特定的用途和使用场景。
为什么需要智能指针
在C++中,使用传统的裸指针管理动态内存可能会导致以下问题:
- 内存泄漏:忘记调用
delete
释放内存 - 重复释放:对同一块内存多次调用
delete
- 悬挂指针:使用已经被释放的内存
- 所有权不明确:难以确定哪个代码负责释放内存
下面是一个演示传统指针可能引起内存泄漏的简单例子:
void someFunction() {MyClass* ptr = new MyClass(); // 分配内存// 一些代码...if (someCondition) {return; // 如果提前返回,会忘记释放内存}// 更多代码...delete ptr; // 正常情况下释放内存
}
智能指针解决了这些问题,让内存管理变得更加安全和简单。
C++标准库中的智能指针
std::unique_ptr
std::unique_ptr
是一种独占所有权的智能指针,它拥有其管理的资源的唯一所有权。当unique_ptr
被销毁时,它所管理的对象也会被自动销毁。
主要特点:
- 不允许复制,但可以移动(转移所有权)
- 轻量级,几乎没有额外开销
- 可以用于管理单个对象或数组
基本用法:
#include <memory>
#include <iostream>class MyClass {
public:MyClass() { std::cout << "MyClass 构造函数被调用" << std::endl; }~MyClass() { std::cout << "MyClass 析构函数被调用" << std::endl; }void doSomething() { std::cout << "正在做一些事情..." << std::endl; }
};int main() {// 创建一个管理MyClass对象的unique_ptrstd::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();// 使用对象ptr1->doSomething();// 转移所有权std::unique_ptr<MyClass> ptr2 = std::move(ptr1);// ptr1现在为nullptrif (!ptr1) {std::cout << "ptr1现在为空" << std::endl;}// 使用ptr2ptr2->doSomething();// 离开作用域时,ptr2自动释放MyClass对象return 0;
}
注意:C++14引入了
std::make_unique
函数,在C++11中需要直接使用std::unique_ptr<T>(new T(...))
。
std::shared_ptr
std::shared_ptr
实现了共享所有权的概念,多个shared_ptr
可以指向同一个对象,当最后一个shared_ptr
离开作用域时,对象才会被销毁。
主要特点:
- 使用引用计数跟踪有多少个
shared_ptr
指向同一个对象 - 允许复制和共享所有权
- 相比
unique_ptr
有一定的性能开销
基本用法:
#include <memory>
#include <iostream>class MyClass {
public:MyClass() { std::cout << "MyClass 构造函数被调用" << std::endl; }~MyClass() { std::cout << "MyClass 析构函数被调用" << std::endl; }
};void useObject(std::shared_ptr<MyClass> ptr) {std::cout << "在函数中使用对象,引用计数: " << ptr.use_count() << std::endl;// 函数结束时,局部的shared_ptr销毁,但对象不会被销毁
}int main() {// 创建shared_ptrstd::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();std::cout << "创建后,引用计数: " << ptr1.use_count() << std::endl;{// 创建共享所有权的ptr2std::shared_ptr<MyClass> ptr2 = ptr1;std::cout << "共享后,引用计数: " << ptr1.use_count() << std::endl;// 传递给函数useObject(ptr1);// 离开作用域,ptr2被销毁,但对象仍然存在}std::cout << "离开内部作用域后,引用计数: " << ptr1.use_count() << std::endl;// main函数结束,ptr1被销毁,引用计数变为0,对象被销毁return 0;
}
std::weak_ptr
std::weak_ptr
是一种不控制所指向对象生命周期的智能指针,它指向由shared_ptr
管理的对象,但不会增加引用计数。这对于解决shared_ptr
可能导致的循环引用问题非常有用。
主要特点:
- 不增加引用计数
- 不能直接访问所指对象,必须先转换为
shared_ptr
- 可以检查所指对象是否还存在
基本用法:
#include <memory>
#include <iostream>class B;class A {
public:std::shared_ptr<B> b_ptr;~A() { std::cout << "A 被销毁" << std::endl; }
};class B {
public:std::weak_ptr<A> a_ptr; // 使用weak_ptr避免循环引用~B() { std::cout << "B 被销毁" << std::endl; }
};int main() {// 创建对象std::shared_ptr<A> a = std::make_shared<A>();std::shared_ptr<B> b = std::make_shared<B>();// 建立关系a->b_ptr = b;b->a_ptr = a;std::cout << "A的引用计数: " << a.use_count() << std::endl;std::cout << "B的引用计数: " << b.use_count() << std::endl;// 使用weak_ptrif (auto locked_a = b->a_ptr.lock()) {std::cout << "A 对象仍然存在" << std::endl;} else {std::cout << "A 对象已被销毁" << std::endl;}// 程序结束时,a和b会被正确销毁return 0;
}
如果B类中也使用shared_ptr
指向A,则会形成循环引用,导致内存泄漏。
智能指针的实际应用
1. 资源管理
智能指针非常适合管理需要在不再使用时释放的各种资源,不仅限于内存:
// 管理文件资源
std::unique_ptr<FILE, decltype(&fclose)> file(fopen("example.txt", "r"), &fclose);
if (file) {// 使用文件...
} // 文件会在这里自动关闭
2. 类的成员变量
在类设计中使用智能指针作为成员变量可以简化资源管理:
class MyClass {
private:std::unique_ptr<Resource> resource_;std::shared_ptr<SharedResource> sharedResource_;public:MyClass() : resource_(std::make_unique<Resource>()),sharedResource_(std::make_shared<SharedResource>()) {}// 不需要在析构函数中显式释放资源// 不需要实现拷贝构造函数和赋值运算符(除非有特殊需求)
};
3. 工厂函数返回值
智能指针是工厂方法返回动态创建对象的理想选择:
std::unique_ptr<Widget> createWidget(WidgetType type) {switch (type) {case WidgetType::Basic:return std::make_unique<BasicWidget>();case WidgetType::Fancy:return std::make_unique<FancyWidget>();default:return nullptr;}
}
智能指针的最佳实践
-
优先使用
std::make_unique
和std::make_shared
:- 异常安全
- 效率更高(特别是
make_shared
可以一次性分配对象和控制块) - 代码更简洁
-
优先考虑
unique_ptr
:- 除非确实需要共享所有权,否则应该首选
unique_ptr
unique_ptr
开销更小,语义更清晰
- 除非确实需要共享所有权,否则应该首选
-
避免对原始指针使用
delete
:- 一旦使用智能指针管理资源,就不要再手动释放
-
注意自定义删除器的使用:
- 对于非内存资源,需要提供正确的删除器
-
避免循环引用:
- 使用
weak_ptr
打破潜在的循环引用
- 使用
-
谨慎处理数组:
- 使用
unique_ptr<T[]>
或shared_ptr<T[]>
来管理数组 - 更好的选择是使用标准容器如
std::vector
- 使用
总结
智能指针是现代C++中内存管理的基石,它们极大地简化了资源管理,减少了内存泄漏的可能性,提高了代码的健壮性。正确使用智能指针需要理解它们的语义和行为特点:
std::unique_ptr
:独占所有权,适用于独占资源的场景std::shared_ptr
:共享所有权,适用于需要在多个地方共享资源的场景std::weak_ptr
:弱引用,用于打破循环引用,或观察但不延长对象生命周期
在现代C++编程中,直接使用裸指针和new
/delete
的情况应该很少见。通过合理使用智能指针和标准容器,可以编写出更安全、更简洁、更易维护的代码。
相关文章:
C++智能指针详解
C智能指针详解 目录 智能指针概述为什么需要智能指针C标准库中的智能指针 std::unique_ptrstd::shared_ptrstd::weak_ptr 智能指针的实际应用智能指针的最佳实践总结 智能指针概述 智能指针是C中用于自动管理动态分配内存的对象,它们遵循RAII(资源获…...
git 设置保存密码 git保存密码
目录 长久保存密码 长久保存密码 git push和git pull都能使用。 git config --global credential.helper store 然后执行一次 git pull,Git 会提示输入用户名和密码, 输入后保存路径: ~/.git-credentials , Windows系统&…...
clamav服务器杀毒(Linux服务器断网状态下如何进行clamav安装、查杀)
ClamAV服务器杀毒(服务器断网状态也可以使用该方法) 服务器因为挖矿病毒入侵导致断网,进行离线的clamav安装并查杀 安装包下载网址:https://www.clamav.net/downloads 安装.deb,如果服务器处于断网状态,可以…...
深入剖析 RocketMQ 的 ConsumerOffsetManager
在消息队列系统中,准确记录和管理消息的消费进度是保障系统可靠性和数据一致性的关键。RocketMQ 作为一款高性能、高可用的分布式消息队列,其 ConsumerOffsetManager 组件在消费进度管理方面发挥着至关重要的作用。本文将详细介绍 ConsumerOffsetManager…...
一文了解 threejs 中.bin 文件与 .gltf 文件 和 .glb 文件三者之间的关系
文章目录 前言一、.bin 文件的作用二、.gltf 文件的作用三、.gltf 和 .bin 的关系四、.glb 文件的作用五、如何查看或编辑 .bin 文件六、总结 前言 在 GLTF 生态中,.bin 文件是 GLTF 格式的重要组成部分,通常与 .gltf 文件一起使用。以下是它们的详细关…...
蓝桥杯(N皇后问题)------回溯法
题目描述 在 NN 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45 角的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法…...
Linux系统中关闭Docker服务并禁止其开机自启 、docker 安装目录结构分析 | 【du -sh *】
文章目录 在Linux系统中关闭Docker服务并禁止其开机自启,具体步骤如下:适用于使用 systemd 的系统(如Ubuntu 16.04/CentOS 7等)适用于使用 SysVinit 或 Upstart 的旧版系统其他注意事项示例输出 linux 下 一条命令实现 统计各个目…...
免费下载 | 2025低空经济产业发展报告
低空经济概览 产业链条:低空经济产业链分为上游的低空经济基础设施(如空管系统、飞行基地等)、中游的低空制造(包括无人机、eVTOL、直升机等飞行器的设计、研发、生产)和下游的低空运营及飞行服务。低空经济以低空空域…...
单一职责原则开闭原则其他开发原则
一、单一职责原则(Single Responsibility Principle, SRP) 定义 一个类应该有且仅有一个引起它变化的原因(即一个类只负责一个职责)。 核心思想 高内聚:类的功能高度集中 低耦合:减少不同职责之间的相互影…...
(自用)yolo算法学习
1.难受中,看了教程过后无从下手啊 2.pycharm专业版成功就好 3.安装包时出先问题 (base) PS G:\pycharm\projects\yolo\yolov5> pip install opencv-python>4.1.1 Requirement already satisfied: opencv-python>4.1.1 in g:\anaconda\app\lib\site-packa…...
手机号登录与高并发思考
基础逻辑 一般来说这个验证码登录分为手机号、以及邮箱登录 手机号短信验证,以腾讯云SMS 服务为例: 这个操作无非对后端来说就是两个接口: 一个是获取验证码,这块后端生成6位数字expire_time 去推送到腾讯云sdk ,腾…...
Linux系统管理与编程07:任务驱动综合应用
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 [环境] windows11、centos9.9.2207、zabbix6、MobaXterm、Internet环境 [要求] zabbix6.0安装环境:Lamp(linux httpd mysql8.0 php) [步骤] 2 …...
12:表的内外连接
1. 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。 新的内连接的语法: select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件; //通过…...
Mybatis的基础操作——03
写mybatis代码的方法有两种: 注解xml方式 本篇就介绍XML的方式 使用XML来配置映射语句能够实现复杂的SQL功能,也就是将sql语句写到XML配置文件中。 目录 一、配置XML文件的路径,在resources/mapper 的目录下 二、写持久层代码 1.添加mappe…...
在CentOS系统上运行Ruby on Rails应用的详细步骤
以下是AI生成,仅做备份。 1. 安装必要的依赖 在CentOS上,首先要安装一些基础的开发工具和依赖库,它们能确保后续的安装和运行过程顺利进行。 sudo yum update -y sudo yum install -y git gcc-c patch readline readline-devel zlib zlib-…...
《AI大模型趣味实战》第6集:基于大模型和RSS聚合打造个人新闻电台
《AI大模型趣味实战》第6集:基于大模型和RSS聚合打造个人新闻电台 摘要 本文将带您探索如何结合AI大模型和RSS聚合技术,打造一个功能丰富的个人新闻电台系统。我们将使用Python和PyQt5构建一个桌面应用程序,该应用可以从多个RSS源抓取新闻&…...
Unity 与 JavaScript 的通信交互:实现跨平台的双向通信
前言 在现代游戏开发和 Web 应用中,Unity 和 JavaScript 的结合越来越常见。Unity 是一个强大的跨平台游戏引擎,而 JavaScript 是 Web 开发的核心技术之一。通过 Unity 和 JavaScript 的通信交互,开发者可以实现从 Unity 到 Web 页面的功能扩…...
Sql Server 索引性能优化 分析以及分表
定位需优化语句 根据工具 skywking 或者开启慢查询日志 找到 慢sql 的语句根据 执行过程 来 判断 慢的原因 row filter 指标 看查了多少数据 比例多少 type 看下是单表 还是 join联表 比如 执行步骤多 没索引 优化方向 减少执行次数索引 没索引考虑加索引 加索引 尽量选择 i…...
Vue.js 模板语法全解析:从基础到实战应用
引言 在 Vue.js 的开发体系中,模板语法是构建用户界面的核心要素,它让开发者能够高效地将数据与 DOM 进行绑定,实现动态交互效果。通过对《Vue.js 快速入门实战》中关于 Vue 项目部署章节(实际围绕 Vue 模板语法展开)…...
【JVM】内存区域划分,类加载机制和垃圾回收机制
本篇内容为了解 JVM 的内存区域划分,类加载机制,垃圾回收机制。实际开发中几乎用不到,但为了某些情况我们又不得不了解。 目录 一、JVM中的内存区域划分 1.1 内存区域划分考点 二、JVM的类加载机制 2.1 类加载流程 2.2 类加载什么时候会…...
代码随想录算法训练营第十四天|替换数字
文档讲解:代码随想录 难度:easy 附:冲 passion!!!passion!!!passion!!! 替换数字 卡码网题目链接(opens new window) 给定一个字符串…...
Java实体类(Javabean)-编程规范
Java学习笔记-Java实体类详解 今天我们要聊一个看似简单却至关重要的知识点——Java实体类。就像快递小哥打包物件需要包装盒一样,在Java世界里处理数据也需要专门的容器,这就是我们的实体类! 一、实体类是什么?——程序的"…...
深入解析 Java Stream API:筛选子节点的优雅实现!!!
🚀 深入解析 Java Stream API:筛选子节点的优雅实现 🔧 大家好!👋 今天我们来聊聊 Java 8 中一个非常常见的操作:使用 Stream API 从 Map 中筛选出特定条件的元素。🎉 具体来说,我们…...
Vala编程语言教程-面向对象编程语基础
基础 尽管Vala语言并不强制你使用对象进行编程,但有些功能只能通过对象的方式来实现。因此,在大多数情况下,你肯定会希望采用面向对象的编程风格。与大多数当前的编程语言一样,为了定义你自己的对象类型,你需要编写一个…...
写读后感的时候,可以适当地引用书中的内容吗?
写读后感时,适当地引用书中的内容是可以的,这样可以更好地支持你的观点和感受,增强文章的可信度和说服力。 引用书中的内容可以帮助读者更好地理解你所讨论的主题和人物,同时也可以展示你对原著的深入理解和阅读能力。但是&#…...
计算机网络高频(二)TCP/IP基础
计算机网络高频(二)TCP/IP基础 1.什么是TCP/IP⭐⭐ TCP/IP是一种网络通信协议,它是互联网中最常用的协议之一。TCP/IP有两个基本的协议:TCP(传输控制协议)和IP(互联网协议)。 TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的协议。它负…...
蓝桥杯 之 数论
文章目录 习题质数找素数 LCM报数游戏 快速幂数字诗意 组合数与错位排序小蓝与钥匙 同余取模 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数&#x…...
无法写入文件:(FileSystemError): Error: EPERM: operation not permitted, open...)
问题分析: 当我想在Visual Studio Code中编写文件时,出现无法写入文件的错误,发现是权限的问题 解决办法: 右键应用图标 → 以管理员身份运行就可以了...
Java爬虫抓取B站视频信息
依赖 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.17.2</version> <!-- 最新版可去官网查看 --></dependency>编码 public static List<VideoDto> parseSearchPage(Str…...
Sql Server数据迁移易错的地方
背景:之前一直台式机,毕业准备答辩了,要将代码搬到笔记本运行才方便些。这个Sql数据弄过来搞了好几个小时 还原备份报错:媒体簇的结构不正确。SQL Server 无法处理此媒体簇。 解决:升级到sql server版本比备份的那个高…...
七、服务器远程桌面报错
🌻🌻目录🌻🌻 一、远程桌面报错-用户账户限制(例如,时间限制)会阻止你登录。 一、远程桌面报错-用户账户限制(例如,时间限制)会阻止你登录。 原因是被远程的系…...
JAVA 之「优先队列」:大顶堆与小顶堆的实现与应用
Java 优先队列:大顶堆与小顶堆的实现与应用 文章目录 Java 优先队列:大顶堆与小顶堆的实现与应用一、什么是优先队列和堆?1. 优先队列2. 堆 二、Java PriorityQueue 基本用法1. 默认小顶堆示例代码输出 2. 实现大顶堆示例代码输出 三、大顶堆…...
压缩壳学习
壳是什么 壳就是软件的一个保护套,防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的;加密壳,通过加密软件来保护软件ÿ…...
VRRP配置双出口ipsec隧道建立。
背景:在做毕设时,发现规划的不是那么合理,vrrp主备切换后,ipsec隧道并没有跟着切换到与备防火墙建立隧道,这是因为配置了双出口,路由的设计导致vrrp主备切换ipsec隧道没有跟着切换。 fw1为主,fw…...
机器学习——Numpy的神奇索引与布尔索引
在 NumPy 中,神奇索引(Fancy Indexing) 和 布尔索引(Boolean Indexing) 是两种强大的索引方式,用于从数组中提取特定元素或子集。以下是它们的详细说明和示例: 1. 神奇索引(Fancy In…...
Linux:进程间通信
文章目录 前言一、进程间通信介绍1.1 进程间通信的目的1.2 进程间通信的发展与分类 二、管道2.1 匿名管道原理2.2 通信管道会出现的情况和特性(重要)2.3 命名管道2.3.1 命名管道与匿名管道的区别 三、system V3.1 共享内存原理3.2 键值3.2.1 键值生成原理…...
Mysql配套测试之查询篇
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 条件查询简单测试: 1.查询英语成绩不及格的同学(<60) 2…...
基于SSM框架的汽车租赁平台(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,汽车租赁平台当然不能排除在外。汽车租赁平台是在实际应用和软件工程的开发原理之上,运用Java语言以及SSM框架进行开发&#x…...
常考计算机操作系统面试习题(三下)
20. 请求页式存储管理系统缺页率计算 题目: 假设一个作业的页面走向为 1、2、3、4、1、2、5、1、2、3、4、5,当分配给该作业的物理块数分别为 3 和 4 时,计算采用下述页面置换算法的缺页率: (1) 先进先出(FIFO&…...
Spring IOC核心详解:掌握控制反转与依赖注入
文章目录 前言一、IOC核心思想二、IOC容器实现1.核心接口:2.XML配置范例 三、Bean管理实践1.创建对象(1)基于xml方式创建对象(2)用注解的方式创建对象 2.依赖注入(1)基于xml方式注入属性基础类型…...
Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发
DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序,必须通过Servlet来处理 没有Servlet,java是无法处理web请求的 Web交互: 接收请求HttpServletRequest:可以获取到请求的信息,比如uri&#…...
Linux 内核源码阅读——ipv4
Linux 内核源码阅读——ipv4 综述 在 Linux 内核中,IPv4 协议的实现主要分布在 net/ipv4/ 目录下。以下是一些关键的源文件及其作用: 1. 协议栈核心 net/ipv4/ip_input.c:处理接收到的 IPv4 数据包(输入路径)。net…...
组合总和 II:去重逻辑深度解析
组合总和 II:去重逻辑深度解析 在算法中,解决“组合总和 II”这类问题时,去重往往是最具挑战性的一环。如何避免重复组合,同时保证所有组合的唯一性,是实现高效算法的关键。今天,我们就来深度解析组合总和…...
蓝桥杯备考:二分答案之路标设置
最大距离,找最小空旷指数值,我们是很容易想到用二分的,我们再看看这个答案有没有二段性 是有这么个二段性的,我们只要二分就行了,但是二分的check函数是有点不好想的,我们枚举空旷值的时候,为了…...
[HY000][1366] Incorrect string value: ‘å¼ ä¸‘ for column ‘name‘ at row 1
常见原因 字符集不兼容 插入的数据包含当前字符集(如 latin1)不支持的特殊字符(如中文、Emoji 等)。 表、列或连接的字符集未正确配置为支持目标字符(如未使用 utf8mb4)。 客户端/服务端编码不一致 客户…...
什么是C++对象之间的view proxies
在C中,view proxies 是一种轻量级的对象,用于提供对另一个对象的间接访问或视图,而不直接拥有或管理该对象的数据。它们通常用于简化对复杂数据结构的访问,或在不需要复制数据的情况下提供特定的视图。 1. View Proxies 的核心概…...
MyBatis参数赋值技巧:#{} 和 ${} 的区别与实践
目录 一、前言二、 #{} 和${} 的使用方法和区别2.1 #{}使用方法2.2 ${}使用方法2.3#{} 和 ${} 的主要区别2.4使用建议 三、总结 一、前言 在 MyBatis 中,#{} 和 ${} 都用于在 SQL 语句中绑定参数,但它们在具体实现和安全性方面有所不同。理解它们的区别…...
5-1 使用ECharts将MySQL数据库中的数据可视化
方法一:使用Python Flask框架搭建API 对于技术小白来说,使用ECharts将MySQL数据库中的数据可视化需要分步骤完成。以下是详细的实现流程: 一、技术架构 后端服务:使用Python Flask框架搭建API(简单易学ÿ…...
协程的调度的对称与非对称
下图表示的就是对称协程,进入到该协程之后只能有一个操作就是yield,把cpu让回给调度器; 下图表示非对称协议,可以有两个操作,就是resume和yield,从哪里resume的,yield就会回到该位子;...
C# 中比较实用的关键字,基础高频面试题!
前言 在C#编程中关键字是构建逻辑和实现功能的基石,它承载着编程语言的语法规则和编程智慧。熟练掌握这些基础高频关键字对提升编程能力和面试表现至关重要,它们是日常开发和解决复杂问题的关键。 DotNetGuide 全面的C#/.NET/.NET Core学习、工作、面试指…...