当前位置: 首页 > article >正文

.NET高频技术点(持续更新中)

1. .NET 框架概述
  • .NET 框架的发展历程
  • .NET Core 与 .NET Framework 的区别
  • .NET 5 及后续版本的统一平台
2. C# 语言特性
  • 异步编程(async/await)
  • LINQ(Language Integrated Query)
  • 泛型与集合
  • 委托与事件
  • 属性与索引器
3. ASP.NET Core
  • MVC 架构模式
  • Razor 页面与视图组件
  • 中间件与管道
  • 依赖注入与配置管理
  • Web API 开发与 Swagger 集成
4. Entity Framework Core
  • 数据模型与数据库上下文
  • 迁移与数据库更新
  • LINQ 查询与性能优化
  • 事务管理与并发控制
  • 数据库提供程序与连接字符串配置
5. 微服务架构
  • 微服务的基本概念与优势
  • 使用 ASP.NET Core 构建微服务
  • 服务发现与负载均衡
  • API 网关与 Ocelot
  • 分布式缓存与消息队列
6. 容器化与 DevOps
  • Docker 容器化 .NET 应用
  • Kubernetes 集群管理与部署
  • CI/CD 管道与 Azure DevOps
  • 监控与日志管理
  • 自动化测试与部署
7. 安全性与身份验证
  • JWT(JSON Web Token)与 OAuth2.0
  • ASP.NET Core 中的身份验证与授权
  • 跨站脚本攻击(XSS)与跨站请求伪造(CSRF)防护
  • 数据加密与安全存储
  • HTTPS 与证书管理
8. 性能优化与调试
  • 性能分析与诊断工具
  • 内存管理与垃圾回收
  • 异步编程与线程池优化
  • 缓存策略与分布式缓存
  • 数据库查询优化与索引
9. 跨平台开发
  • .NET 跨平台支持与 Xamarin
  • MAUI(.NET Multi-platform App UI)
  • Blazor 与 WebAssembly
  • 跨平台桌面应用开发
  • 移动应用开发与发布

一、 值类型与引用类型的区别

    /// <summary>/// 类/// </summary>class TestClass{public int Id { get; set; }public string Name { get; set; }}/// <summary>/// 结构体/// </summary>struct TestStruct{public int Id { get; set; }public string Name { get; set; }}class Program{static void Main(string[] args){//测试引用类型TestClass c1 = new TestClass { Id = 0, Name = "未定义" };TestClass c2 = c1;//c1给了c2c2.Id = 1;c2.Name = "a";Console.WriteLine($"c1[{c1.Id},{c1.Name}]");//测试值类型TestStruct s1 = new TestStruct { Id = 0, Name = "未定义" };TestStruct s2 = s1;//s1给了s2s2.Id = 2; s2.Name = "b";Console.WriteLine($"s1[{s1.Id},{s1.Name}]");Console.ReadKey();}}

在这里插入图片描述
值类型的每一次赋值都会执行一次逐字段的复制,引用类型的赋值只是指针的传递,其实也是生成新的指针实例。

二、 什么是装箱、拆箱

装箱:装箱操作时将值类型隐式地转换成引用类型。装箱一个数值会为其分配一个对象实例,并把该数值复制到新对象中。

拆箱:拆箱操作是指显式地把引用类型转换成值类型

int i=123;
object o=i;//装箱
int j=(int)o//拆箱

Int32—>Object 装箱 object o=i;//装箱
在这里插入图片描述
从图可知,对象 o 存的是地址引用,指向的是堆上的值,这个值的类型和变量 i 一样,也是 int 类型,值(123)也就是从变量 i Copy 过来的一个副本值而已。

Object —> Int32 拆箱 int a2=(int) objs//拆箱
在这里插入图片描述
要在运行时成功拆箱值类型,被拆箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。

注意:频繁的装箱和拆箱比较耗费CUP资源,降低代码的执行效率和用户体验度。
改进方案:使用泛型类,泛型能很好的解决由装箱和拆箱带来的效率问题。具体使用请查阅泛型相关资料。

//简单案例
public T ReturnElement<T>() where T : ICollection<int>, new() 
{ return new T(); 
}

三、 多线程下C#如何保证线程安全

问题出现的结果完全是无法确定的,包括但不限于如下结果:

  • 应用异常,且无法自恢复,必须重启站点或服务;
  • 陷入死循环,导致CPU占用100%,从而整台服务器崩溃;
  • 错误数据入库,导致一系列的排查、数据修复的困难,甚至可能无法修复数据;

因此,很有必要做几次全局的筛查,做一些特征值搜索和处理,
简单梳理了一下,凡是符合如下5种特征的代码,都存在线程不安全的可能性:

1、类的静态变量:
public class Iamclass
{static Dictionary<string, string> _cache = new Dictionary<string, string>();public static void Operation(){_cache.Add(new Guid().ToString(), "1");// 线程不安全代码}
}2、类的静态属性:
public class Iamclass
{static Dictionary<string, string> Cache {get; set;} = new Dictionary<string, string>();public static void Operation(){Cache.Add(new Guid().ToString(), "1");// 线程不安全代码}
}3、单例对象的静态变量:
public class XxxService
{IIamclass instance = IocHelper.GetSingleInstance<IIamclass>(); // 获取单例
}
public class Iamclass : IIamclass
{Dictionary<string, string> _cache = new Dictionary<string, string>();public void Operation(){_cache.Add(new Guid().ToString(), "1");// 线程不安全代码}
}4、单例对象的静态属性:
public class XxxService
{IIamclass instance = IocHelper.GetSingleInstance<IIamclass>(); // 获取单例
}
public class Iamclass : IIamclass
{Dictionary<string, string> Cache {get; set;} = new Dictionary<string, string>();public void Operation(){Cache.Add(new Guid().ToString(), "1");// 线程不安全代码}
}5、多线程共享的局部变量
public class XxxService
{public void Operation(){var cache = new Dictionary<string, string>();System.Threading.Tasks.Parallel.For(1, 10, idx =>{cache.Add(new Guid().ToString(), "1"); //线程不安全代码});}
}

列举下线程安全问题:
1、应用错误且无法恢复的,通常异常为:索引超出了数组界限:

public class MessageService : BaseService
{private static Dictionary<string, Timer> _timerDict = new Dictionary<string, Timer>();public async void SendMessageAsync(string msgId, MessageInputDto2 input){var timer = new Timer(60 * 1000) { AutoReset = true };_timerDict[msgId] = timer;     // 问题代码timer.Elapsed += (sender, eventArgs) =>{try{/* 具体业务代码 */timer.Stop();timer.Close();_timerDict.Remove(msgId);}catch(Exception exp){// 异常处理代码}}}
}

解决方法,一般是加锁
注意:如果加lock 可能出现瓶颈,要进行流程梳理,是否要更换实现方案:

lock(_timerDict)
{_timerDict[msgId] = timer;     // 问题代码
}
timer.Elapsed += (sender, eventArgs) =>
{try{/* 具体业务代码 */timer.Stop();timer.Close();lock(_timerDict){_timerDict.Remove(msgId);}}catch(Exception exp){// 异常处理代码}
}

2、陷入死循环,导致服务器CPU 100%卡顿问题:
有个常见业务,获取一串没有使用过的随机数或随机字符串,比如用户身份Token,比如抽奖等等
下面是常见的获取不重复的随机数代码,
在_rnd.Next 没有加锁,其内部方法InternalSample会导致返回结果都是0,从而导致while陷入死循环:

public class CodeService
{private static Random _rnd = new Random(Guid.NewGuid().GetHashCode());public static GetCode(){var ret = "";var redis = IocHelper.GetSingleInstance<IRedis>();// 获取一个未使用过的序号do{ret = _rnd.Next(10000).ToString();  // 问题代码}while(!redis.Add(ret, "", TimeSpan.FromSeconds(3600)));return ret;}
}

解决方法,双重校验:加锁,并判断循环次数:

public class CodeService
{private static Random _rnd = new Random(Guid.NewGuid().GetHashCode());public static GetCode(){var ret = "";var redis = IocHelper.GetSingleInstance<IRedis>();var maxLoop = 10;// 获取一个未使用过的序号do{lock(_rnd){ret = _rnd.Next(10000).ToString();}}while(!redis.Add(ret, "", TimeSpan.FromSeconds(3600)) && (maxLoop--) > 0);if(maxLoop <= 0){throw new Exception("10次循环,未找到可用数据:" + ret);}return ret;}
}

四、 内存溢出与内存泄露

1、内存溢出
系统不能再给你的请求分配所需要的空间了,比如你申请了30M,系统剩余内存只有20M了。这就叫内存溢出。
比如一个办公室空间有限只有5个工位,领导安排6个人来这屋,还有一个人怎么办?只能找领导安排其它地方了。还比如在栈的操作中如果栈已经满了,当我们再对栈进行入栈操作就会造成上溢。

2、内存泄露
内存泄露是申请了内存空间的变量一直在占用,无法释放。比如申请了一块内存空间,没有回收一直占用,直到最后内存溢出。
比如在C#中使用非托管代码,如果不使用析构函数回收就会造成内存泄露。如果不是特殊情况,所以建议尽量不要使用非托管资源来编写代码。还比如在代码中使用了静态变量也容易导致内存泄露,关于内存泄露的情况大家可以查看“避坑指南:可能会导致.NET内存泄露的8行为”。

五、 讲讲.NET的GC原理

GC与内存管理(含深度解析)

六、 async/await相关问题

七、 事件和委托的异同

八、 依赖注入相关问题

九、 ASP.NET Core 中的服务生命周期

十、 ASP.NET Core中间件

相关文章:

.NET高频技术点(持续更新中)

1. .NET 框架概述 .NET 框架的发展历程.NET Core 与 .NET Framework 的区别.NET 5 及后续版本的统一平台 2. C# 语言特性 异步编程&#xff08;async/await&#xff09;LINQ&#xff08;Language Integrated Query&#xff09;泛型与集合委托与事件属性与索引器 3. ASP.NET…...

pandas中的数据聚合函数:`pivot_table` 和 `groupby`有啥不同?

pivot_table 和 groupby 是 pandas 中两种常用的数据聚合方法&#xff0c;它们都能实现数据分组和汇总&#xff0c;但在使用方式和输出结构上有显著区别。 0. 基本介绍 groupby分组聚合 groupby 是 Pandas 库中的一个功能强大的方法&#xff0c;用于根据一个或多个列对数据进…...

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT 数据集准备常用数据集自定义数据集AlpacaShareGPT数据集准备 常用数据集 预训练数据集 Wiki Demo (en)RefinedWeb (en)RedPajama V2 (en)Wikipedia (en)Wikipedia (zh)Pile (en)...

【Gradio】helloworld程序

前言 发现这个库用来做可视化的demo还不错&#xff0c;简单学习一下。 官网 https://www.gradio.app/ 安装 pip install gradio -i https://pypi.tuna.tsinghua.edu.cn/simple/helloWorld 示例 import gradio as grdef greet(name):return "hello"nameifacegr…...

机器学习例题——预测facebook签到位置(K近邻算法)和葡萄酒质量预测(线性回归)

一、预测facebook签到位置 代码展示&#xff1a; import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import…...

对golang中CSP的理解

概念&#xff1a; CSP模型&#xff0c;即通信顺序进程模型&#xff0c;是由英国计算机科学家C.A.R. Hoare于1978年提出的。该模型强调进程之间通过通道&#xff08;channel&#xff09;进行通信&#xff0c;并通过消息传递来协调并发执行的进程。CSP模型的核心思想是“不要通过…...

使用 pgrep 杀掉所有指定进程

使用 pgrep 杀掉所有指定进程 pgrep 是一个查找进程 ID 的工具&#xff0c;结合 pkill 或 kill 命令可以方便地终止指定进程。以下是几种方法&#xff1a; 方法1&#xff1a;使用 pkill&#xff08;最简单&#xff09; pkill 进程名例如杀掉所有名为 “firefox” 的进程&…...

Missashe考研日记-day36(改版说明)

Missashe考研日记-day36 改版说明 经过一天的思考、纠结和尝试&#xff0c;博主决定对更新内容进行改版&#xff0c;如下&#xff1a;1.不再每天都发一篇日记&#xff0c;改为一周发一篇包含一周七天学习进度的周记&#xff0c;但为了标题和以前相同&#xff08;强迫症&#…...

基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南

引言&#xff1a;边缘计算赋能智能监控 在AIoT时代&#xff0c;将深度学习模型部署到嵌入式设备已成为行业刚需。本文将手把手指导读者在NVIDIA Jetson Nano&#xff08;4GB版本&#xff09;开发板上&#xff0c;构建基于YOLOv5SORT算法的实时目标跟踪系统&#xff0c;集成无人…...

【LunarVim】CMake LSP配置

在 LunarVim 中为 CMakeLists.txt 文件启用代码提示&#xff08;如补全和语义高亮&#xff09;&#xff0c;需要安装支持 CMake 的 LSP&#xff08;语言服务器&#xff09;和适当的插件。以下是完整配置指南&#xff1a; 1、配置流程 1.1 安装cmake-language-server 通过 Ma…...

Mkdocs页面如何嵌入PDF

嵌入PDF 嵌入PDF代码 &#xff0c;注意PDF的相对地址 <iframe src"../个人简历.pdf (相对地址)" width"100%" height"800px" style"border: 1px solid #ccc; overflow: auto;"></iframe>我的完整代码&#xff1a; <d…...

从零开始学Flink:开启实时计算的魔法之旅

在凌晨三点的数据监控大屏前&#xff0c;某电商平台的技术负责人突然发现一个异常波动&#xff1a;支付成功率骤降15%。传统的数据仓库此时还在沉睡&#xff0c;而基于Flink搭建的实时风控系统早已捕捉到这个信号&#xff0c;自动触发预警机制。当运维团队赶到时&#xff0c;系…...

融合静态图与动态智能:重构下一代智能系统架构

引言&#xff1a;智能系统的分裂 当前的大模型系统架构正处于两个极端之间&#xff1a; 动态智能体系统&#xff1a;依赖语言模型动态决策、自由组合任务&#xff0c;智能灵活但稳定性差&#xff1b; 静态流程图系统&#xff1a;具备强工程能力&#xff0c;可控可靠&#xf…...

滑动窗口-窗口中的最大/小值-单调队列

求窗口的最大值 #include <iostream> //滑动窗口最大值用单调队列q[]&#xff0c;q存储候选最大值的下标 //队列头是最大值的下标 using namespace std; const int N100010; int nums[N],q[N]; int hh0,tt-1;// hh 是队头指针&#xff0c;tt 是队尾指针&#xff0c;初始…...

Java设计模式全面详解:从基础到高级的23种模式简介

引言:设计模式概述 设计模式是软件设计中常见问题的典型解决方案,它们就像预制的蓝图,你可以通过调整来解决代码中反复出现的设计问题。Java设计模式通常分为三大类: 创建型模式:处理对象创建机制结构型模式:处理对象组合行为型模式:处理对象间的交互与职责分配#mermai…...

WORD压缩两个免费方法

日常办公和学习中&#xff0c;Word文档常常因为包含大量图片、图表或复杂格式而导致文件体积过大&#xff0c;带来诸多不便&#xff0c;比如 邮件发送受限&#xff1a;许多邮箱附件限制在10-25MB&#xff0c;大文件无法直接发送 存储空间占用&#xff1a;大量文档占用硬盘或云…...

skywalking服务安装与启动

skywalking服务安装并启动 1、介绍2、下载apache-skywalking-apm3、解压缩文件4、创建数据库及用户5、修改配置文件6、下载 MySQL JDBC 驱动7、启动 OAP Serve,需要jkd11,需指定jkd版本,可以修改文件oapService.sh8、启动 Web UI,需要jkd11,需指定jkd版本,可以修改文件oapServi…...

Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType)

Qt 中信号与槽&#xff08;signal-slot&#xff09;机制支持 多种连接方式&#xff08;ConnectionType&#xff09; Qt 中信号与槽&#xff08;signal-slot&#xff09;机制支持 多种连接方式&#xff08;ConnectionType&#xff09;&#xff0c;用于控制信号发出后如何调用槽…...

Booth Encoding vs. Non-Booth Multipliers —— 穿透 DC 架构看乘法器的底层博弈

目录 &#x1f9ed; 前言 &#x1f331; 1. Non-Booth 乘法器的实现原理&#xff08;也叫常规乘法器&#xff09; &#x1f527; 构建方式 ✍️ 例子&#xff1a;4x4 Non-Booth 乘法器示意 &#x1f9f1; 硬件结构 ✅ 特点总结 ⚡ 2. Booth Encoding&#xff08;布斯编码…...

Midjourney-V7:支持参考图片头像或背景生成新保真图

Midjourney-V7重磅升级Omni Reference&#xff1a;全能图像参考神器&#xff01;再也不用担心生成图片货不对版了&#xff01; 就在上周&#xff0c;Midjourney发版它最新的V7版本&#xff1a;Omini Reference&#xff0c;提供了全方位图像参考功能&#xff0c;它可以参考你提…...

耀圣-气动带刮刀硬密封法兰球阀:攻克颗粒高粘度介质的自清洁 “利器”

气动带刮刀硬密封法兰球阀&#xff1a;攻克颗粒高粘度介质的自清洁 “利器” 在化工、矿业、食品加工等行业中&#xff0c;带颗粒高粘度介质、料浆及高腐蚀性介质的输送与控制一直是行业难题。普通阀门极易因介质附着、颗粒堆积导致卡阻失效&#xff0c;密封面磨损加剧&#x…...

Google云计算原理和应用之分布式锁服务Chubby

Chubby是Google设计的提供粗粒度锁服务的一个文件系统,它基于松耦合分布式系统,解决了分布的一致性问题。通过使用Chubby的锁服务,用户可以确保数据操作过程中的一致性。不过值得注意的是,这种锁只是一种建议性的锁(Advisory Lock)而不是强制性的锁,这种选择系统具有更大…...

SM2Utils NoSuchMethodError: org.bouncycastle.math.ec.ECFieldElement$Fp.<init

1&#xff0c;报错图示 2&#xff0c;报错原因&#xff1a; NoSuchMethodError 表示运行时找不到某个方法&#xff0c;通常是编译时依赖的库版本与运行时使用的库版本不一致。 错误中的 ECFieldElement$Fp. 构造函数参数为 (BigInteger, BigInteger)&#xff0c;说明代码期望使…...

《100天精通Python——基础篇 2025 第16天:异常处理与调试机制详解》

目录 一、认识异常1.1 为什么要使用异常处理机制?1.2 语法错误1.3 异常错误1.4 如何解读错误信息 二、异常处理2.1 异常的捕获2.2 Python内置异常2.3 捕获多个异常2.4 raise语句与as子句2.5 使用traceback查看异常2.6 try…except…else语句2.7 try…except…finally语句--捕获…...

动态创建链表(头插法、尾插法)

今天我们来学习动态创建链表&#xff01;&#xff01;&#xff01; 动态创建链表&#xff1a;分为头插法和尾插法 头插法&#xff08;动态创建&#xff09;&#xff1a; 头插法就是让新节点变成头 代码如下 吐血了&#xff1a;这边有个非常重要的知识点&#xff0c;这边第三…...

利用混合磁共振成像 - 显微镜纤维束成像技术描绘结构连接组|文献速递-深度学习医疗AI最新文献

Title 题目 Imaging the structural connectome with hybrid MRI-microscopy tractography 利用混合磁共振成像 - 显微镜纤维束成像技术描绘结构连接组 01 文献速递介绍 通过多种模态绘制大脑结构能够增进我们对大脑功能、发育、衰老以及疾病的理解&#xff08;汉森等人&am…...

安全监控之Linux核心资产SSH连接监测邮件

文章目录 一、引言二、邮箱设置三、脚本配置四、登录测试 一、引言 在某些特殊时期&#xff08;如HVV&#xff09;需要重点监控Linux核心资产SSH连接登录活动情况&#xff0c;实现ssh登录报警监控。其实实现方式并不难。 二、邮箱设置 在邮箱中需要启用“SMTP”协议&#xf…...

文旅田园康养小镇规划设计方案PPT(85页)

1. 项目背景与定位 背景&#xff1a;位于长三角经济圈&#xff0c;依托安吉丰富的自然与文化资源&#xff0c;旨在打造集康养、度假、文化体验于一体的综合小镇。 定位&#xff1a;成为浙北地区知名的康养旅游目的地&#xff0c;融合“一溪两岸”规划理念&#xff0c;实现全面…...

部署Superset BI(四)连接sql server数据库

sqlserver没有出现在Superset的连接可选菜单上&#xff0c;这一点让我奇怪。既然没有那就按着HANA的配置方式&#xff0c;照猫画虎。更奇怪的是安装好还不能出现&#xff0c;难道superset和微软有仇&#xff1f; --修改配置文件 rootNocobase:/usr/superset/superset# cd docke…...

【Linux操作系统】第一弹——Linux基础篇

文章目录 &#x1f4a1; 一. Linux的基本常识&#x1fa94; 1.1 linux网络连接三种方式&#x1fa94;1.2 虚拟机的克隆&#x1fa94;1.3 虚拟机的快照&#x1fa94;1.4 虚拟机的迁移和删除&#x1fa94;1.5 vmtools工具 &#x1f4a1;二. Linux的目录结构&#x1fa94;2.1 Linu…...