为什么值类型存储在栈上
弱引用、弱事件GC收集器会在第0代饱和时开始回收托管堆对象对于那些已经申明或绑定的不经访问的对象或事件因为不经常访问而且还占内存(有点懒加载的意思)所以即时对象可达但我想在GC回收的时候仍然对其回收当需要用到的时候再创建这种情况该怎么办那么这其中就引入了两个概念WeakReference弱引用、WeakEventManager弱事件对于这2两个不区分语言的共同概念大家可自行扩展百度此处就不再举例。GC堆回收那么除了通过new对象而达到代的阈(临界)值时还有什么能够导致垃圾堆进行垃圾回收呢 还可能windows报告内存不足、CLR卸载AppDomain、CLR关闭等其它特殊情况。或者我们还可以自己通过代码调用。.NET有GC来帮助开发人员管理内存并且版本也在不断迭代。GC帮我们托管内存但仍然提供了System.GC类让开发人员能够轻微的协助管理。 这其中有一个可以清理内存的方法(并没有提供清理某个对象的方法)GC.Collect方法可以对所有或指定代进行即时垃圾回收(如果想调试需在release模式下才有效果)。这个方法尽量别用因为它会扰乱代与代间的秩序从而让低代的垃圾对象跑到生命周期长的高代中。GC还提供了判断当前对象所处代数、判断指定代数经历了多少次垃圾回收、获取已在托管堆中分配的字节数这样的三个方法我们可以从这3个方法简单的了解托管堆的情况。托管世界的内存不需要我们打理我们无法从代码中得知具体的托管对象的大小你如果想追求对内存最细微的控制显然C#并不适合你不过类似于有关内存把控的这部分功能模块我们可以通过非托管语言来编写然后通过.NET平台的P/Invoke或COM技术(微软为CLR定义了COM接口并在注册表中注册)来调用。像FCL中的源码很多涉及到操作系统的诸如 文件句柄、网络连接等外部extren的底层方法都是非托管语言编写的对于这些非托管模块所占用的资源我们可以通过隐式调用析构函数(Finalize)或者显式调用的Dispose方法通过在方法内部写上非托管提供的释放方法来进行释放。像文中示例的socket就将释放资源的方法写入Dispose中析构函数和Close方法均调用Dispose方法以此完成释放。事实上在FCL中的使用了非托管资源的类大多都遵循IDispose模式。而如果你没有释放非托管资源直接退出程序那么操作系统会帮你释放该程序所占的内存的。垃圾回收对性能的影响还有一点垃圾回收是对性能有影响的。GC虽然有很多优化策略但总之只要当它开始回收垃圾的时候为了防止线程在CLR检查期间对对象更改状态所以CLR会暂停进程中的几乎所有线程(所以线程太多也会影响GC时间)而暂停的时间就是应用程序卡死的时间为此对于具体的处理细节GC提供了2种配置模式让我们选择。第一种为单CPU的工作站模式专为单CPU处理器定做。这种模式会采用一系列策略来尽可能减少GC回收中的暂停时间。而工作站模式又分为并发(或后台)与不并发两种并发模式表现为响应时间快速不并发模式表现为高吞吐量。第二种为多CPU的服务器模式它会为每个CPU都运行一个GC回收线程通过并行算法来使线程能真正同时工作从而获得性能的提升。我们可以通过在Config文件中更改配置来修改GC模式如果没有进行配置那么应用程序总是默认为单CPU的工作站的并发模式并且如果机器为单CPU的话那么配置服务器模式则无效。如果在工作站模式中想禁用并发模式则应该在config中运行时节点添加如果想更改至服务器模式则可以添加 。复制代码复制代码gcConcurrent: https://docs.microsoft.com/zh-cn/dotnet/framework/configure-apps/file-schema/runtime/gcconcurrent-elementgcServer: https://docs.microsoft.com/zh-cn/dotnet/framework/configure-apps/file-schema/runtime/gcserver-element性能建议虽然我们可以选择适合的GC工作模式来改善垃圾回收时的表现但在实际开发中我们更应该注意减少不必要的内存开销。几个建议是减换需要创建大量的临时变量的模式、考虑对象池、大对象使用懒加载、对固定容量的集合指定长度、注意字符串操作、注意高频率的隐式装箱操作、延迟查询、对于不需要面向对象特性的类用static、需要高性能操作的算法改用外部组件实现(p/invoke、com)、减少throw次数、注意匿名函数捕获的外部对象将延长生命周期、可以阅读GC相关运行时配置在高并发场景注意变换GC模式…对于.NET中改善性能可延伸阅读 https://msdn.microsoft.com/zh-cn/library/ms973838.aspx 、 https://msdn.microsoft.com/library/ms973839.aspx.NET程序执行图至此.NET Framework上的三个重要概念程序集、应用程序域、内存在本文讲的差不多了我画了一张图简单的概述.NET程序的一个执行流程对于后文我将单独的介绍一些其它杂项首先是.NET平台的安全性。.NET的安全性.NET Framework中的安全机制分为 基于角色的安全机制 和 代码访问安全机制 。基于角色的安全性基于角色的安全机制作为传统的访问控制其运用的非常广泛如操作系统的安全策略、数据库的安全策略等等…它的概念就相当于我们经常做的那些RBAC权限管理系统一样用户关联角色角色关联权限权限对应着操作。整个机制的安全逻辑就和我们平时编写代码判断是一样的大致可以分为两个步骤.第一步就是创建一个主体然后标识这个主体是什么身份(角色) 第二步就是 身份验证也就是if判断该身份是否可以这样操作。而在.NET Framework中这主体可以是Windows账户也可以是自定义的标识通过生成如当前线程或应用程序域使用的主体相关的信息来支持授权。比如构造一个代表当前登录账户的主体对象WindowsPrincipal然后通过 AppDomain.CurrentDomain.SetThreadPrincipal(主体对象);或Thread.CurrentPrincipal的set方法来设置应用程序域或线程的主体对象 最后使用System.Security.Permissions.PrincipalPermission特性来标记在方法上来进行授权验证。如图我当前登录账号名称为DemoXiaoZeng然后通过Thread.CurrentPrincipal设置当前主体执行aa方法顺利打印111。如果检测到PrincipalPermission类中的Name属性值不是当前登录账号那么就报错对主体权限请求失败。在官方文档中有对.NET Framework基于角色的安全性的详细的介绍感兴趣可以去了解 https://docs.microsoft.com/zh-cn/dotnet/standard/security/principal-and-identity-objects#principal-objects代码访问安全性在.NET Framework中还有一个安全策略叫做 代码访问安全Code Access Security也就是CAS了。代码访问安全性在.NET Framework中是用来帮助限制代码对受保护资源和操作的访问权限。举个例子我通过创建一个FileIOPermission对象来限制对后续代码对D盘的文件和目录的访问如果后续代码对D盘进行资源操作则报错。FileIOPermission是代码控制访问文件和文件夹的能力。除了FileIOPermission外还有如PrintingPermission代码控制访问打印机的权限、RegistryPermission代码控制操作注册表的权限、SocketPermission控制接受连接或启动Socket连接的权限。对于这些通过代码来对受保护资源和操作的权限限制也就是这些类名后缀为Permission的类它们叫做 Permissions(权限)都继承自CodeAccessPermission都有如DemandAssertDenyPermitOnlyIsSubsetOfIntersect和Union这些方法在MSDN上有完整的权限列表https://msdn.microsoft.com/en-us/library/h846e9b3(vvs.100).aspx为了确定代码是否有权访问某一资源或执行某一操作CLR的安全系统将审核调用堆栈以将每个调用方获得的权限与要求的权限进行比较。 如果调用堆栈中的任何调用方不具备要求的权限则会引发安全性异常并拒绝访问。图出自 https://docs.microsoft.com/zh-cn/dotnet/framework/misc/code-access-security而除了Permissions权限代码访问安全性机制还有 权限集、证据、代码组、策略等概念。这些概念让CAS如此强大但相应的它们也让CAS变得复杂必须为每个特定机器定义正确的PermissionSet和Code Groups才能设置成一个成功的CAS策略。考虑到这层原因Microsoft .NET安全小组决定从头开始重建代码访问安全性。在.NET Framework4.0之后就不再使用之前的那套CAS模型了而是使用.NET Framework 2.0中引入的安全透明模型然后稍加修改修改后的安全透明模型成为保护资源的标准方法被称之为安全透明度级别2安全透明度2介绍https://msdn.microsoft.com/en-us/library/dd233102(vvs.100).aspx.NET Framework4.0的安全更改https://msdn.microsoft.com/en-us/library/dd233103(vvs.100).aspx一个完整的CAS演示https://www.codeproject.com/Articles/5724/Understanding-NET-Code-Access-Security对于安全透明度级别2我将不再介绍感兴趣的可以看我推荐的这2篇文章对Level2的安全透明度介绍的比较详细包括实践、迁移。https://www.red-gate.com/simple-talk/dotnet/.net-framework/whats-new-in-code-access-security-in-.net-framework-4.0—part-i/https://www.red-gate.com/simple-talk/dotnet/net-framework/whats-new-in-code-access-security-in-net-framework-4-0-part-2/须注意.NET平台上的安全机制仅仅是.NET平台上的因此它只限制于托管代码我们可以直接调用非托管代码或进程通信间接调用非托管代码等多个手段来突破对托管代码 操作资源的限制。事实上我们在平常项目中代码编写的安全机制(业务逻辑身份验证、项目框架验证)与这些平台级的安全机制没什么不同。我们可以理解为代码写的位置不一样.NET安全机制是写在CLR组件中而我们的安全机制是写在上层的代码中。这些平台级的标识更多的是和操作系统用户有关而我们项目代码中的标识则是和在数据库中注册的用户有关 大家都是通过if else来去判断判断的主体和格局不一样逻辑本质都是相同的。NET Core不支持代码访问安全性和安全性透明性。.NET是什么我在前文对.NET系统概述时有的直接称.NET有的称.NET Framework。那么准确来说什么是.NET?什么又是.NET Framework呢.NET是一个微软搭造的开发者平台它主要包括1.支持(面向)该平台的编程语言(如C#、Visual Basic、C/CLI、F#、IronPython、IronRuby…)2.用于该平台下开发人员的技术框架体系(.NET Framework、.NET Core、Mono、UWP等)1.定义了通用类型系统庞大的CTS体系2.用于支撑.NET下的语言运行时的环境CLR3…NET体系技术的框架库FCL3.用于支持开发人员开发的软件工具(即SDK如VS2017、VS Code等).NET Framework是什么事实上像我上面讲的那些诸如程序集、GC、AppDomain这样的为CLR的一些概念组成实质上指的是.NET Framework CLR。.NET平台是微软为了占据开发市场而成立的不是无利益驱动的纯技术平台的那种东西。基于该平台下的技术框架也因为 商业间的利益 从而和微软自身的Windows操作系统所绑定。所以虽然平台雄心和口号很大但很多框架类库技术都是以Windows系统为蓝本这样就导致虽然.NET各方面都挺好但是用.NET就必须用微软的东西直接形成了技术-商业的绑定。.NET Framework就是.NET 技术框架组成在Windows系统下的具体的实现和Windows系统高度耦合上文介绍的.NET系统就是指.NET Framework。部署.net Framework https://docs.microsoft.com/zh-cn/dotnet/framework/deployment/deployment-guide-for-developers.NET Framework高级开发https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2008/29eafad8(v%3dvs.90).NET Framework源码在线浏览https://referencesource.microsoft.com/如何在VS中调试.NET Framework源代码最为关键的是pdb符号文件没得符号就调不了对于符号我们从微软的符号服务器上下载(默认就已配置)还得有源代码来调试。点击工具-选项-调试-常规如果你之前没有在该配置栏配置过那么你就勾选 启用源服务器支持 、启用.net Framework源代码单步执行然后将 要求源文件与原始版本完全匹配 给取消掉。然后就是下载pdb符号文件了如果想直接下载那么可以在调试-符号这栏 将Microsoft符号服务器给勾上 。如果想按需下载那么在调试的时候可以点击调试-窗口 选择 模块/调用堆栈 来选择自己想加载的去加载。

相关新闻

自动化新闻播报系统:核心技术架构与实现

自动化新闻播报系统:核心技术架构与实现

1. 项目概述:自动化新闻播报系统的核心价值 每天早上被新闻唤醒是什么体验?作为一个坚持做了三年个人新闻简报的媒体从业者,我开发了一套自动化新闻播报系统。这个系统每天凌晨5点自动抓取全网热点,经过智能筛选和语音合成&#x…

2026/10/12 16:19:51 阅读更多 →
UE5 C++基础框架设计:事件系统、数据管理与对象池实战

UE5 C++基础框架设计:事件系统、数据管理与对象池实战

1. 项目概述:为什么UE5 C项目需要一套基础功能框架? 如果你是从蓝图转向C的UE开发者,或者刚接触UE5 C的新手,大概率会遇到一个困境:每次开新项目,都要从零开始搭建那些“轮子”。比如,怎么优雅地…

2026/10/12 16:20:36 阅读更多 →
Shadcn注册表技能:让AI编程助手精准生成符合项目规范的UI组件

Shadcn注册表技能:让AI编程助手精准生成符合项目规范的UI组件

1. 先搞清楚 Shadcn 注册表到底解决什么实际问题 如果你在用 Claude Code 这类 AI 编程助手做前端开发,最常遇到的尴尬就是:AI 生成的 UI 组件代码看起来能跑,但和项目里现有的设计规范、组件库或主题体系完全不搭。每次都要手动调整样式、引…

2026/10/12 6:25:27 阅读更多 →

最新新闻

卡牌出牌规划与DP优化:权值线段树从O(n²)到O(nK log m)实战

卡牌出牌规划与DP优化:权值线段树从O(n²)到O(nK log m)实战

最近在写一个卡牌对战游戏的战斗模拟器时,栽在了一个看起来很简单的最优出牌规划上:牌堆从左到右一张张翻,你可以打出也可以跳过,但打出的卡牌等级必须不降,而且整个战斗最多打K张牌。攻击力显然要尽量高,所…

2026/10/14 17:19:42 阅读更多 →
如何构建你的第一个RAG系统:JavaScript+Embeddings+Neo4j语义检索完整教程(engenharia-de-software-com-ia-aplicada)

如何构建你的第一个RAG系统:JavaScript+Embeddings+Neo4j语义检索完整教程(engenharia-de-software-com-ia-aplicada)

【免费下载链接】engenharia-de-software-com-ia-aplicada Cdigos e referncias usados na Ps de Engenharia de Software com IA Aplicada 项目地址: https://gitcode.com/gh_mirrors/en/engenharia-de-software-com-ia-aplicada 点击查看 免费下载 在 engenharia…

2026/10/14 17:19:42 阅读更多 →
概述| 赵杰 | 量子精神哲学

概述| 赵杰 | 量子精神哲学

作者:赵杰,清华大学硕士、微美全息云科技(NASDAQ:WIMI)董事长、微算法科技(NASDAQ:MLGO)董事长、育杰奖学金创始人人类对精神的探索贯穿古今哲学、宗教与科学的全部历程。传统西方哲…

2026/10/14 17:19:42 阅读更多 →
baidupcsapi 版本演进全记录:从 2013 年首个封装到 Python 3 移植的百度网盘 API 技术时间线

baidupcsapi 版本演进全记录:从 2013 年首个封装到 Python 3 移植的百度网盘 API 技术时间线

后端 【免费下载链接】baidupcsapi 百度网盘api 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcsapi 点击查看 免费下载 本文以 CHANGELOG.md 为主线,完整复盘 baidupcsapi 从 2013 年原作者发布首个版本、到 2014 年 fork 重写、再到 2017 年移…

2026/10/14 17:19:42 阅读更多 →
STM32按键控制LED:GPIO输入模式、上拉电阻与消抖实战

STM32按键控制LED:GPIO输入模式、上拉电阻与消抖实战

到这一篇,路子得掉个头了。前面四篇玩LED点灯、流水灯、蜂鸣器,本质都是同一件事:让单片机往外送出高低电平。但单片机想“懂事”,光会说话不听是不行的。按键控制LED小灯,就是把这个“听”的动作接进来——用按键的按…

2026/10/14 17:19:42 阅读更多 →
TreeTycoon开发实战:从数据模型到经济平衡的完整指南

TreeTycoon开发实战:从数据模型到经济平衡的完整指南

简介:TreeTycoon 是一套基于 C17 与 SFML 开发的 2D 模拟经营游戏源码项目,面向具备一定 C 基础、希望研究游戏引擎架构与经营类玩法实现的开发者。项目围绕树木种植与经营主题,采用自定义游戏框架,涵盖场景栈管理、资源加载、音频…

2026/10/14 17:18:41 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →