Effective C#阅读笔记-6Prefer Immutable Atomic Value Types不可变值类型

Prefer Immutable Atomic Value Types不可变值类型:一旦创建,将不会变化(constant),不能改变object内部状态。

基于不可变值类型创建的上层的模块将会更加的健壮,可靠性也会更加的有保证,由于不可变值类型对象在创创建安之后,内部状态就不能改变,这样就省去了很多状态检查的代码,在多线程环境下也不会出现状态不一致的情况。

对于不可变值类型有以下的好处:

1.多线程安全:If the internal state cannot change, there is no chance for different threads to see inconsistent views of the data. Immutable types can be exported from your objects safely.

2.很适合hash类型的集合:The caller cannot modify the internal state of your objects. Immutable types work better in hash-based collections. The value returned byObject.GetHashCode() must be an instance invariant ; that's always true for immutable types.

实例化不可变值类型对象或者是创建不可值类型对象通常有三种方法

1.创建适当的构造函数,这个是比较简单通常的方法

2.使用工厂方法,静态方法。Factories make it easier to create common values. The .NET FrameworkColor type follows this strategy to initialize system colors. The static methodsColor.FromKnownColor() and Color.FromName() return a copy of a color value that represents the current value for a given system color.

3.创建一个可变的同步类(mutable companion class )来创建一个不可变的对象,这种情况特别适合需要多步才能完成创建的情况,(string 和StringBuiler类就是一个很好的例子)The .NET string class follows this strategy with theSystem.Text.StringBuilder class. You use the StringBuilder class to create a string using multiple operations. After performing all the operations necessary to build the string, you retrieve the immutable string from theStringBuilder

4。Immutable types are simpler to code and easier to maintain. Don't blindly createget and set accessors for every property in your type. Your first choice for types that store data should be immutable, atomic value types. You easily can build more complicated structures from these entities.不要盲目的创建get set属性访问,对于数据存储首选的的不可变的源自操作的值类型对象,基于这些对象你能快速的构建更复杂的对象


<think> 我们之前已经讨论过在ESP-IDF v5.2中LED_STRIP配置不可见的问题。现在用户已经执行了`idf.py set-target esp32 --prefer-system`,但问题仍然存在。根据之前的引用内容,我们可以总结出以下几点: 1. 需要确保已经添加了led_strip组件的依赖(使用`idf.py add-dependency`命令)。 2. 可能需要清理配置缓存(如`sdkconfig`文件)并重新配置。 3. 如果组件存在,可以通过命令行直接设置配置项。 用户当前的情况是已经执行了`idf.py set-target`命令,但搜索不到LED_STRIP配置。因此,我们将按照以下步骤进行: **步骤1:添加组件依赖** 在项目目录下执行: ```bash idf.py add-dependency "esp_idf==5.2.*" led_strip ``` **步骤2:清理并重新配置** ```bash rm sdkconfig sdkconfig.old idf.py reconfigure ``` **步骤3:检查组件是否安装** 虽然执行了`set-target`,但`prefer-system`只是优先使用系统安装的ESP-IDF,所以我们需要确保系统安装的ESP-IDF中包含了led_strip组件。可以通过检查路径`$IDF_PATH/components/led_strip`是否存在来验证。 **步骤4:通过命令行直接配置** 如果菜单中仍然不可见,可以尝试通过命令行设置: ```bash idf.py menuconfig --set-values CONFIG_LED_STRIP_ENABLE=y CONFIG_LED_STRIP_GPIO=18 CONFIG_LED_STRIP_LED_NUMBER=24 ``` **步骤5:彻底清理项目** 如果上述步骤无效,则执行完整清理: ```bash idf.py fullclean rm -rf sdkconfig sdkconfig.old build idf.py reconfigure ``` **步骤6:验证** 重新运行`idf.py menuconfig`,然后按照路径`Component config → Driver configurations → LED strip configuration`查找,或者使用搜索功能(按`/`键)搜索`LED_STRIP`。 另外,根据引用内容,在v5.2中,LED Strip的配置路径已经改变,所以确保在正确的路径下查找。 如果用户已经执行了`set-target`,那么目标已经设置为esp32,我们只需要确保组件依赖正确。 最后,如果问题仍然存在,可能需要检查系统安装的ESP-IDF版本是否为v5.2,因为`prefer-system`会使用系统安装的版本。可以使用`idf.py --version`来确认。 由于用户的问题描述中提到“已执行 'idf.py set-target esp32 --prefer-system' 操作”,我们需要强调在添加依赖和清理步骤后,重新配置的重要性。 现在,我们按照上述逻辑生成回答。 </think> 根据您已执行 `idf.py set-target esp32 --prefer-system` 后仍无法找到 LED_STRIP 配置的情况,以下是系统级解决方案: ### 解决方案步骤 1. **强制添加组件依赖** ```bash # 显式添加LED strip组件依赖 idf.py add-dependency "esp_idf==5.2.*" led_strip # 清理配置缓存 rm -f sdkconfig sdkconfig.old ``` 2. **验证组件完整性** ```bash # 检查组件是否正确安装 ls $IDF_PATH/components/led_strip ``` ✔︎ 应有输出:`CMakeLists.txt Kconfig.projbuild led_strip.c` 3. **命令行强制配置** ```bash idf.py menuconfig --set-values \ CONFIG_LED_STRIP_ENABLE=y \ CONFIG_LED_STRIP_GPIO=18 \ CONFIG_LED_STRIP_LED_NUMBER=24 ``` 4. **深度清理重建** ```bash idf.py fullclean idf.py set-target esp32 --prefer-system idf.py reconfigure ``` ### 验证方法 1. 在 `menuconfig` 中搜索路径: ``` (Top) → Component config → Driver configurations → LED strip configuration ``` 2. 搜索功能验证: - 按 `/` 输入 `LED_STRIP` - 应有输出: ``` Symbol: LED_STRIP_ENABLE [=y] Location: Component config → Driver configurations ``` ### 系统级修复原理 当使用 `--prefer-system` 时,系统会优先使用全局安装的 ESP-IDF。若全局安装缺少组件或版本不匹配,会导致: 1. 组件路径解析失败:$$ \text{Project Path} \cap \text{System IDF Path} = \emptyset $$ 2. Kconfig 配置树未加载:$$ \sum_{comp}^{components} Kconfig.projbuild \not\supset \text{LED_STRIP} $$ > **关键提示**:工业级项目中建议固定 ESP-IDF 版本[^1]: > ```bash > python -m pip install "esp-idf==5.2.0" --force-reinstall > ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值