C#中如何通过字符串检索获取不同类型的变量值
方案说明
你当前用两个平行数组、靠索引对齐存变量名和值的思路存在偏差,问题很明确:
- 常规静态类型数组只能存固定类型的数据,没法直接同时承载char、bool、int、float四类值,强转要么丢失类型信息,要么用无类型指针带来大量内存安全、类型匹配错误
- 手动维护两个数组的索引对应关系成本极高,增删、修改键值对时很容易出现键和值错位的问题,排查难度很大
正确实现思路
核心是用字符串做键的哈希表(字典)结构搭配类型安全的可变值容器,完全不需要自己维护索引关系:
- 外层直接用语言内置的哈希表结构,原生支持通过字符串键快速检索对应值,比自己写数组遍历查找效率高、维护成本低
- 哈希表的值部分做一层轻量封装,同时记录「当前值的类型」和「具体数值」两个信息,取值时先判断类型再读取,避免类型不匹配的错误
不同语言的参考实现
- C++(C++17及以上):直接用
std::unordered_map<std::string, std::variant<char, bool, int, float>>,std::variant本身就是类型安全的联合类型,会自动维护当前存储的值类型,取值时调用std::get<目标类型>(对应键的值)即可,不要用void*裸指针存值 - C#/Java:用内置的
Dictionary<string, object>/HashMap<String, Object>作为存储结构,取值时先通过类型判断(is/instanceof)确认值类型后再转换使用;如果要更严谨的类型安全,可以自己定义一个值包装类,用枚举标记值类型、对应字段存不同类型的数值 - Python/JS这类动态类型语言:直接用原生对象/字典存储即可,动态类型本身就支持同一个字典里存不同类型的值,取值时做下类型判断就不会出错
注意:如果你需要按插入顺序遍历所有键值对,直接选各语言提供的有序哈希表实现即可,比如C++的
std::map、Python3.7+的原生dict、Java的LinkedHashMap,依然比自己维护两个平行数组的方案可靠。
内容的提问来源于stack exchange,提问作者jusky
相关产品推荐
相关产品推荐

