C#中单行赋值并返回字典值会触发两次查找吗?
问题解答
先看你给出的两个C#代码示例:
第一个单行写法:
public sealed class TestClass { private Dictionary<string,int> myDictionary = []; public int TestMethod() => myDictionary["foo"] = 3; }
第二个多行写法:
public sealed class TestClass { private Dictionary<string,int> myDictionary = []; public int TestMethod() { var val = 3; myDictionary["foo"] = val; return val; } }
核心问题解答
会不会执行两次字典查找?
不会。C#中的赋值表达式(myDictionary["foo"] = 3)本身会返回被赋予的值,也就是3,而非先赋值再重新查找键取值。编译器会直接优化为:找到"foo"对应的位置(不存在则添加),将值设为3,然后直接返回3,不会额外执行一次查找操作。能不能把多行写法简化成单行?
完全可以。这两种写法的执行逻辑和性能完全一致,单行写法只是语法糖,编译后的IL代码和多行版本几乎无差别,都是先完成赋值再返回同一个值,不存在额外的字典查找开销。
本质上,单行写法里的myDictionary["foo"] = 3是一个表达式,它的结果就是赋值的右操作数(3),直接返回这个表达式的结果,和先把值存入变量再返回的效果完全相同,没有性能差异。
内容的提问来源于stack exchange,提问作者user3163495
相关产品推荐
相关产品推荐

