<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Vanderbiol的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Vanderbiol</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Vanderbiol]]></copyright><item><title><![CDATA[C#学习笔记——WPF——数据订阅刷新]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/150209963</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/150209963</guid><author>Vanderbiol</author><pubDate>Mon, 11 Aug 2025 11:14:12 +0800</pubDate><description><![CDATA[本文系统介绍了WPF中实现数据驱动UI的三种核心机制：1）通过INotifyPropertyChanged实现属性变更通知，在属性setter中触发PropertyChanged事件；2）使用ObservableCollection实现集合变更通知，其内置的CollectionChanged事件会在增删改时自动触发；3）借助ICommand的CanExecuteChanged机制实现命令状态更新。文章详细解析了每种机制的工作原理，包括WPF绑定系统如何自动订阅事件、数据变更时如何触发UI刷新等核心流程，并指]]></description><category></category></item><item><title><![CDATA[C#学习笔记——基础概念——结构体和类]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/149436996</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/149436996</guid><author>Vanderbiol</author><pubDate>Fri, 18 Jul 2025 08:57:24 +0800</pubDate><description><![CDATA[本文对比了C#中结构体和类的主要区别。结构体是值类型，分配在栈上，复制时创建新副本，适合小型数据且无需继承的场景；类是引用类型，分配在堆上，支持继承和复杂逻辑。结构体默认成员为private，不能定义无参构造函数，而类可以。示例代码展示了结构体和类的用法差异：结构体赋值创建新副本，类赋值只是引用复制。建议结构体用于小型数据（16字节内）和值语义场景，类用于大型数据、继承和引用语义需求。结构体适合性能敏感场景，类适合复杂逻辑需求。]]></description><category></category></item><item><title><![CDATA[C#学习笔记——基础概念——数组]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/149436726</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/149436726</guid><author>Vanderbiol</author><pubDate>Fri, 18 Jul 2025 08:38:41 +0800</pubDate><description><![CDATA[本文系统介绍了C#数组的核心知识。数组是固定大小、类型相同的数据结构，通过索引访问元素（从0开始）。主要内容包括：数组声明与初始化语法（如int[] arr = {1,2,3}）、元素访问方法、多维数组和交错数组的区别、常用属性和方法（Length、Sort等）。文章对比了数组与List&lt;T&gt;的特性差异，列举了索引越界等常见错误，并介绍了ref遍历、Span&lt;T&gt;等进阶技巧。数组适合数据量固定且需高性能访问的场景，而动态数据推荐使用List&lt;T&gt;。掌握这些知识能帮助开发者]]></description><category></category></item><item><title><![CDATA[C#学习笔记——基础概念——C#中的？和？？]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/149436566</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/149436566</guid><author>Vanderbiol</author><pubDate>Fri, 18 Jul 2025 08:26:09 +0800</pubDate><description><![CDATA[C#中空值处理运算符详解：?、??和??=的用法与区别。?运算符用于可空类型和三元条件判断；??空合并运算符在左值为null时返回右值；??=运算符在左值为null时才赋值。这些运算符能简化代码，提高可读性，常见于数据库交互、表单处理和可选参数等场景。最佳实践建议合理使用这些运算符替代冗长的null判断，但要避免过度嵌套导致逻辑混乱。组合使用时可以优雅处理多层对象属性访问和默认值设置。]]></description><category></category></item><item><title><![CDATA[C#学习笔记——基础概念——值传递、引用传递、输出传递]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/149425029</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/149425029</guid><author>Vanderbiol</author><pubDate>Thu, 17 Jul 2025 16:52:28 +0800</pubDate><description><![CDATA[本文介绍了C#中参数传递的三种方式：值传递、引用传递（ref）和输出传递（out）。值传递会创建参数副本，不会影响原始变量；ref关键字通过传递内存地址允许方法修改原始变量，需在调用前后都赋值；out关键字主要用于从方法返回多个值，调用前无需赋值但方法内必须赋值。文章详细说明了ref和out的语法、使用场景及注意事项，并对比了两者的区别，还介绍了C#7.0后对ref和out的增强功能。out参数特别适合Try模式和多返回值场景，能避免异常处理开销并优化性能。]]></description><category></category></item><item><title><![CDATA[C#学习笔记——基础概念——Namespace详解]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/149424684</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/149424684</guid><author>Vanderbiol</author><pubDate>Thu, 17 Jul 2025 16:31:02 +0800</pubDate><description><![CDATA[特性C++C#命名空间关键字namespace是否支持匿名命名空间✅ 支持❌ 不支持是否支持内联命名空间✅ C++11+ 支持❌ 不支持是否支持命名空间别名✅✅是否支持嵌套命名空间✅✅是否需要头文件声明✅❌是否强制命名空间与文件结构一致❌❌（但建议一致）同一命名空间下的多个类：当这些类紧密相关或服务于相同的功能模块时。不同命名空间下的类：当它们代表不同的概念或服务不同的业务领域时。分多个文件但同一命名空间：为了提高代码的可维护性和组织性，特别是对于较大的项目。]]></description><category></category></item><item><title><![CDATA[C#学习笔记——基础概念——什么是Lambda 表达式]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/149416718</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/149416718</guid><author>Vanderbiol</author><pubDate>Thu, 17 Jul 2025 10:57:24 +0800</pubDate><description><![CDATA[C#中的Lambda表达式是定义匿名函数的简洁方式，支持两种形式：表达式Lambda（适合简单计算）和语句Lambda（适合复杂逻辑）。与C++相比，C#的Lambda语法更简洁（无需捕获列表）。常见应用场景包括LINQ查询、事件处理和异步编程。Lambda可以捕获外部变量（闭包），并适配Action、Func等内置委托类型。这种语法特性显著提升了代码的可读性和开发效率，特别适合短小、一次性的函数场景。使用时需注意多线程环境下的变量修改问题。]]></description><category></category></item><item><title><![CDATA[C#学习笔记——基础概念——什么是委托（Delegate）]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/149357164</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/149357164</guid><author>Vanderbiol</author><pubDate>Tue, 15 Jul 2025 16:04:27 +0800</pubDate><description><![CDATA[C# 的委托 = C++ 的函数指针 + std::function + lambda 的结合体，并且更安全、更强大、更易用。]]></description><category></category></item><item><title><![CDATA[C++：常见错误LNK2019的原因之一，父类未实现构造函数]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/145868595</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/145868595</guid><author>Vanderbiol</author><pubDate>Wed, 26 Feb 2025 08:43:17 +0800</pubDate><description><![CDATA[报错消失，经排查为A的默认构造未实现，而C的默认构造直接调用A的默认构造，因此出现只找到声明而找不到定义的错误。报错：error link2019public: _thiscall 该函数符号在……]]></description><category></category></item><item><title><![CDATA[面试八股-3-线程进程协程]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/132088852</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/132088852</guid><author>Vanderbiol</author><pubDate>Tue, 08 Aug 2023 14:50:00 +0800</pubDate><description><![CDATA[而对线程而言，除了 CPU 外，系统不会为线程分配内存（线程所使用的资源来自其所属进程的资源），线程组之间只能共享资源；1. 线程是操作系统的资源，线程的创建、切换、停止等都非常消耗资源，而创建协程不需要调用操作系统的功能，编程语言自身就能完成，所以协程也被称为用户态线程，协程比线程轻量很多；2. 进程和线程切换时，需要切换进程和线程的上下文，进程的上下文切换时间开销远远大于线程上下文切换时间，耗费资源较大，效率要差一些；对条件的测试是在互斥锁的保护下进行的，条件变量始终与互斥锁一起使用。]]></description><category></category></item><item><title><![CDATA[面试八股-2-进程有多少种状态，如何转换]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/132088785</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/132088785</guid><author>Vanderbiol</author><pubDate>Thu, 03 Aug 2023 17:38:41 +0800</pubDate><description><![CDATA[阻塞状态：在运行状态期间，如果进行了阻塞的操作，此时进程暂时无法操作就进入到了阻塞状态，在这些操作完成后就进入就绪状态。- 创建：一个进程启动，首先进入创建状态，需要获取系统资源创建进程管理块（PCB：Process Control Block）完成资源分配。- 运行状态：获取处理器资源，被系统调度，当具有时间片开始进入运行状态。- 就绪状态：在创建状态完成之后，进程已经准备好，处于就绪状态，但是还未获得处理器资源，无法运行。- 终止状态：进程结束或者被系统终止，进入终止状态。2. 进程状态转换图。]]></description><category></category></item><item><title><![CDATA[面试八股-1-进程通信方式有哪些]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/132088652</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/132088652</guid><author>Vanderbiol</author><pubDate>Thu, 03 Aug 2023 17:35:31 +0800</pubDate><description><![CDATA[对信号量的操作分为 P 操作和 V 操作，P 操作是将信号量的值减 1，V 操作是将信号量的值加 1。信号是 Linux 进程间通信的最古老的方式之一，是事件发生时对进程的通知机制，有时也称之为软件中断，它是在软件层次上对中断机制的一种模拟，是一种异步通信的方式。消息队列就是一个消息的链表，可以把消息看作一个记录，具有特定的格式以及特定的优先级，对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息，对消息队列有读权限的进程则可以从消息队列中读走消息，消息队列是随内核持续的。]]></description><category></category></item><item><title><![CDATA[Leetcode-重塑矩阵C++实现]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/132087876</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/132087876</guid><author>Vanderbiol</author><pubDate>Thu, 03 Aug 2023 17:09:59 +0800</pubDate><description><![CDATA[思路：先判断能否成功转换，不能直接返回原矩阵，如果能的话逐行遍历矩阵存储在vectortemp中，然后当temp.size为c时temp存储到res中，并清空temp重新开始。在 MATLAB 中，有一个非常有用的函数 reshape ，它可以将一个 m x n 矩阵重塑为另一个大小不同（r x c）的新矩阵，但保留其原始数据。给你一个由二维数组 mat 表示的 m x n 矩阵，以及两个正整数 r 和 c ，分别表示想要的重构的矩阵的行数和列数。否则，输出原始矩阵。]]></description><category></category></item><item><title><![CDATA[Leetcode-数组拆分C++实现]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/132083618</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/132083618</guid><author>Vanderbiol</author><pubDate>Thu, 03 Aug 2023 14:55:27 +0800</pubDate><description><![CDATA[给定长度为 2n 的整数数组 nums ，你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ，使得从 1 到 n 的 min(ai, bi) 总和最大。思路：说的乱七八糟，其实就是排序，然后隔位相加就完了。返回该 最大总和。]]></description><category></category></item><item><title><![CDATA[Leetcode-N叉树的最大深度C++实现]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/131999797</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/131999797</guid><author>Vanderbiol</author><pubDate>Sat, 29 Jul 2023 20:53:36 +0800</pubDate><description><![CDATA[递归，先判断当前节点为空和无子树的情况，然后逐个判断子树深度并记录最大值，最后返回的时候要加上当前节点的深度1。N 叉树输入按层序遍历序列化表示，每组子节点由空值分隔（请参见示例）。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。给定一个 N 叉树，找到其最大深度。]]></description><category></category></item><item><title><![CDATA[Leetcode-反转字符串中的单词IIIC++实现]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/131999305</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/131999305</guid><author>Vanderbiol</author><pubDate>Sat, 29 Jul 2023 20:07:14 +0800</pubDate><description><![CDATA[你需要反转字符串中每个单词的字符顺序，同时仍保留空格和单词的初始顺序。笨死了笨死了，状态不好，感觉是写的最烂的一道题。空格切分，每个单词单独反转，去掉开头的空格。s 包含可打印的 ASCII 字符。s 中的所有单词都用一个空格隔开。s 不包含任何开头或结尾空格。s 里 至少 有一个词。]]></description><category></category></item><item><title><![CDATA[Leetcode-学生出勤记录IC++实现]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/131999076</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/131999076</guid><author>Vanderbiol</author><pubDate>Sat, 29 Jul 2023 19:46:27 +0800</pubDate><description><![CDATA[给你一个字符串 s 表示一个学生的出勤记录，其中的每个字符用来标记当天的出勤情况（缺勤、迟到、到场）。学生 不会 存在 连续 3 天或 连续 3 天以上的迟到（'L'）记录。如果学生可以获得出勤奖励，返回 true；否则，返回 false。两个标志分别记录A和L的次数，L若不是连续则重新开始计数。按 总出勤 计，学生缺勤（'A'）严格 少于两天。'P'：Present，到场。'A'：Absent，缺勤。'L'：Late，迟到。]]></description><category></category></item><item><title><![CDATA[Leetcode-反转字符串ⅡC++实现]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/131897333</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/131897333</guid><author>Vanderbiol</author><pubDate>Mon, 24 Jul 2023 15:24:29 +0800</pubDate><description><![CDATA[给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。最笨的方法，按三种情况去判断，然后根据每种情况去实现。如果剩余字符少于 k 个，则将剩余字符全部反转。]]></description><category></category></item><item><title><![CDATA[Leetcode-二叉搜索树的最小绝对差C++实现]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/131895751</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/131895751</guid><author>Vanderbiol</author><pubDate>Mon, 24 Jul 2023 14:35:06 +0800</pubDate><description><![CDATA[二叉搜索树中序遍历得到有序序列（代码写错了，应该Inorder不是preorder），然后插值最小的两个节点在序列中一定相邻，所以计算相邻节点的最小差值即可。差值是一个正数，其数值等于两值之差的绝对值。给你一个二叉搜索树的根节点。]]></description><category></category></item><item><title><![CDATA[Leetcode-最长特殊序列ⅠC++实现]]></title><link>https://blog.youkuaiyun.com/Vanderbiol/article/details/131895115</link><guid>https://blog.youkuaiyun.com/Vanderbiol/article/details/131895115</guid><author>Vanderbiol</author><pubDate>Mon, 24 Jul 2023 14:10:05 +0800</pubDate><description><![CDATA[例如，"abc" 是 "aebdc" 的子序列，因为删除 "aebdc" 中斜体加粗的字符可以得到 "abc"。"aebdc" 的子序列还包括 "aebdc" 、 "aeb" 和 "" (空字符串)。给你两个字符串 a 和 b，请返回 这两个字符串中 最长的特殊序列  的长度。如果不存在，则返回 -1。「最长特殊序列」 定义如下：该序列为 某字符串独有的最长子序列（即不能是其他字符串的子序列）。字符串 s 的子序列是在从 s 中删除任意数量的字符后可以获得的字符串。评论区说了这题应该是搞笑难度。]]></description><category></category></item></channel></rss>