摘要:
1. 委托内部结构 委托类型包含三个重要的非公共字段: _target 字段 静态方法包装:当委托包装一个静态方法时,该字段为 null。 实例方法包装:当委托包装实例方法时,该字段引用回调方法所操作的对象。 _methodPtr 字段 标识委托要调用的方法。 _invocationList 字段 阅读全文
摘要:
在实际项目中,我们常常需要高效、线程安全地加载配置文件。为了确保在高并发场景下配置只加载一次、且读取速度尽可能快,我们往往会设计一些特殊的加载方案。今天,我将记录一次从具体实现问题出发,逐步抽象出高级设计概念的过程。 1. 高效加载配置的需求 在项目初期,我们的需求很简单:如何在多线程环境下高效加载 阅读全文
摘要:
众所周知C#的DllImport特性只允许将常量字符串赋值给DllName。 C/C++动态库在不同平台上可能具有不同的名称。 用nativedep这个库来举例:在windows上可能叫nativedep.dll、linux上叫libnativedep.so、macos上叫libnativedep. 阅读全文
摘要:
在框架开发的过程中很容易被““普遍接受””的思维束缚,导致设计结果不上不下,重构活动更是如此。 在重构或设计新框架时,应该运用关注点分离思想:首先明确推迟“普遍接受”,专注于解决技术难题和构建系统的内在价值;然后,再思考如何将这种价值以易于理解、易于采纳的方式展示给用户。过早地迎合用户的传统习惯,往 阅读全文
摘要:
记录一下。 应用程序莫名报这个错,其它电脑上正常。 可能是Application Verifier这个工具影响到了。 进入注册表:win+R->regedit->HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows NT->CurrentVersion-> 阅读全文
摘要:
1、不要做出任何应用程序才需要考虑抉择策略,不能想当然的决定一些错误情形。具体的一个体现形式是什么异常都捕获。这不是类库的职责,因为无法掌握所有的调用者的使用情形,这些不确定性是委托、虚方法、接口等特性带来的。 一个直观的例子是调用者可能故意在委托中抛出异常以便在后面的逻辑中捕获它。 同时编写类库与 阅读全文
摘要:
以交错数组byte[][]为例。 fixed无法固定byte[][],只能在编译时固定确定数量的变量。 交错数组byte[][]中的每一个byte[]可以采用GCHandle进行固定。 int n = 10; var arrays = new byte[n][]; var arrHandles = 阅读全文
摘要:
AAA 指的是 "Arrange, Act, Assert",这是一种通用的单元测试模式。 在测试方法中, 1、首先对测试对象进行准备(Arrange), 2、然后调用要测试的方法(Act), 3、最后检查预期结果(Assert)是否符合预期。 遵循 AAA 模式可以使测试方法更加清晰和易于阅读。 阅读全文
摘要:
单元测试项目的目标框架 (TargetFramework或TargetFrameworks) 不能是standard2.0或standard2.1。 这是因为.NET Standard只是一个规范,它没有运行时,不能创建应用程序,只能创建库。 如果要测试面向standard2.0的项目,可以将单元测 阅读全文
摘要:
C# 类库中的 StreamWriter 类在释放时会同时关闭其所依赖的基础流对象,这是为了确保所有缓冲数据都被写入基础流中,并且在不再需要 StreamWriter 对象时,基础流对象也能够被及时释放和关闭。这种设计的初衷是为了方便开发者使用 StreamWriter,避免出现遗漏缓冲数据或不及时 阅读全文