WordPress的数据迁移
WordPress数据迁移 必装的几个插件 1) WPvivid(可一键备份文件和数据库) 2)Media Cloud Sync(将图片等静态资源同步到OSS的神器) 以CF的R2存储为例,只需点击 Sync Media To Cloud就可以将WPvivid插件备份的这些图片等数据一键同步到新的 OSS上;当然,你得先连接好自己的 OSS才能操作。 3)Better Search Replace(一款改变表数据库表的路径神器) 有时候域名失效或者是url地址前面需要换成新的前缀即可使用此插件一键替换。首先选中需要替换路径的表,然后点击 Run as dry run(此时选中),后面会提示你是否更改,确认更改后就取消 Run as dry run的选中状态即可更新新的路径。
第一篇博客
先来练练手。 Quick StartCreate a new post1$ hexo new "My New Post" Run server1$ hexo server Generate static files1$ hexo generate Deploy to remote sites1$ hexo deploy
常用特殊符号与关键字语法糖速查指南
1. 空值(Null)与可空类型处理Type?(可空值类型 / Nullable Types) 说明:C# 中的基本值类型(如 int, bool, double, DateTime, struct 等)默认是不允许为 null 的。在类型后面加上 ?,可以将其提升为“可空值类型”,使其能够赋予 null 值(本质上是 Nullable<T> 的语法糖)。 代码示例: 123456789101112131415// 普通值类型:不能赋值 null,编译直接报错// int age = null; // 可空值类型:可以赋值 null(常用于数据库中的 Nullable 字段或未填项)int? age = null; DateTime? birthDate = null;if (age.HasValue) { Console.WriteLine($"年龄是:{age.Value}");} else { Console.WriteLine("年龄未填写");&...
委托与事件:从类型安全函数指针到发布-订阅模型
一、 委托的核心本质:它不是方法,而是“类型契约”1. 声明委托(定义契约)在 C# 中,定义一个委托类型需要严格指定其参数类型和返回类型。委托是一个引用类型,它在底层本质上是一个派生自System.MulticastDelegate 的类(Class)。这就像是定义了一个方法的“形状”或契约: 1public delegate int MathOperation(int num1, int num2); 当你敲下上面这行代码时,C# 编译器在底层会悄悄帮你生成一个完整的类: 123456789// 编译器的幕后黑手:所有的委托类型都隐式派生自 System.MulticastDelegatepublic sealed class MathOperation : System.MulticastDelegate{ // 构造函数:接收一个对象实例和方法的内存地址 public MathOperation(object @object, IntPtr method); // 同步调用核心 public virtual int Invoke(i...
C# 文件IO复盘
一、 划分使用边界:小文件靠 File,大文件靠 Stream1. 小文件时代的“全家桶”(File 静态类)如果文件只有几十 KB 或几 MB(比如配置文件、简单的配置日志),直接用官方封装好的 File 静态方法最香。 精确到行:用 File.ReadAllLines(),能把文本按行切分成字符串数组返回,非常适合解析行规则固定的配置。 整体吞吐:用 File.WriteAllText() 或 File.ReadAllText(),直接将整个文本作为一整个 string 返回。 二进制流:用 File.ReadAllBytes()读取多媒体文件(图片、小音频)。 2. 必须切换到 Stream(流)的危险信号一旦文件规模达到 几十MB甚至上百MB,或者需要高频不间断地写入数据,就必须全面抛弃 File。 底层分析:File.ReadAllText 的本质是把文件数据一次性全部加载到堆内存中。如果要读一个 1G 的日志,它就会在内存里瞬间开辟 1G 的空间,直接引发频繁的 GC,甚至抛出 OutOfMemoryException 挂掉程序。 二、 核心底层拆解:FileSt...
Hashtable 与 Dictionary 的底层对比和踩坑复盘
一、 Dictionary<K, V> 的底层双数组架构与扩容现代C#开发里我们基本都在用 Dictionary<K, V>,它之所以查询高效且支持泛型,离不开它底层的双数组设计: 12private int[]? _buckets; // 桶数组:存的是 entries 数组的索引下标private Entry[]? _entries; // 条目数组:实际存 Key-Value 数据和链表指针 1. 它是怎么处理哈希冲突的?当两个不同的键通过 GetHashCode() 计算出来的哈希值取模后,定位到了同一个 bucket(即发生哈希冲突),Dictionary 采用的是拉链法(链地址法)。 它不会满地去找空桶,而是让新条目的 next 指针指向老条目,在_entries数组内部组成一个单向链表。 2. 扩容时的隐藏开销当数据写满(_count == _entries.Length)时,字典会触发动态扩容。 扩容的操作非常重:不仅是把数组容量翻倍,最消耗性能的是它需要对所有老数据重新计算哈希值,并在新数组里重新分配桶(Rehash)。 避坑策...
反射的基础用法与核心避坑
最近在项目开发中接触到了反射(Reflection),在看一些底层公共组件和基础框架时经常能遇到它。为了加深理解,我把反射的核心基础用法、实际应用场景以及需要注意的性能隐患做了一次梳理和记录。 一、 什么是反射?在 C# 中,常规编写代码是在编译期就确定了类型和调用关系;而反射则是提供了一种在运行期动态窥探和操作程序集的能力。 程序运行起来后,其对应的类、方法、属性等元数据都会保存在程序集中。通过反射,我们可以在程序运行的过程中动态地获取这些类型信息,甚至直接实例化对象、调用里面的方法或读写属性。 二、 获取 Type 对象的三种基础用法在 C# 中,使用反射的第一步永远是拿到目标类的 Type 对象。通常有以下三种最基础的获取方式: 1. 用法一:typeof(类名) 说明:在编译期就已经明确知道要获取哪个类的类型信息。 示例:1Type t = typeof(User); 2. 用法二:obj.GetType() 说明:手里已经有了具体的对象实例,在运行期通过实例来获取其真实的类型信息。 示例:12User user = new User();Type t = user.G...
C# 常用类复盘
一、 String 的不变性与 StringBuilder 的最佳实践1. 什么时候该用 StringBuilder?以前我习惯在任何地方都直接用 + 或$符号去拼接字符串,直到在处理大量流水数据导出或者高频日志拼接时,发现程序直接卡死,内存占用飙升。 核心原因在于 C# 中的string具有不可变性。每次执行 str += "abc",系统其实并没有在原文本后面追加,而是在堆内存里重新开辟空间创建了一个新字符串,并把老字符串丢弃变成内存垃圾。 因此,划分使用场景的界限非常明确: 用 String 的场景:少量的字符串拼接(如 3 次以内),或者纯粹的常量文本组合。此时编译器会自动优化,性能反而最好。 用 StringBuilder 的场景:处于 for/foreach 循环内部的拼接,或者需要高频、动态组装大量文本的场景。 2. StringBuilder 的核心优势换成 StringBuilder 后,它之所以能解决卡顿问题,是因为它在内部机制中维护了一个可变的字符缓冲区(char 数组)。所有追加操作(Append)都是直接在这个数组上进行修改,避免...







