C# Expression Bodied方法返回新实例与缓存引用的性能差异
结论先行
你给出的表达式体写法每次调用GetList()时都会重新执行表达式、生成全新的List<Guid>实例,表达式体本身只是C#的语法糖,不会改变方法的执行逻辑,它和下面写全的普通方法行为100%等价:
private static List<Guid> GetList() { return new List<Guid>() { new Guid("f93b8c93-3084-4087-8727-dad436fe5b76"), new Guid("6894046e-1deb-4128-b639-aa472f7f95d3") // many more }; }
两种实现的核心差异
- 性能与内存表现
缓存静态字段的实现中,CacheList是静态只读字段,只会在所属类型第一次被加载时完成一次初始化,整个程序生命周期内仅存在这一个实例,每次调用GetList都只是返回同一个引用,没有额外的内存分配和元素初始化开销。
而表达式体的实现每次调用都要分配新的List堆内存、初始化所有Guid元素填充到列表中,如果方法调用频率高、列表元素多,会产生大量不必要的GC压力,性能差距会非常明显。 - 功能特性区别
缓存实现返回的是同一个实例,外部拿到列表后如果执行Add/Remove/Clear等修改操作,会影响所有后续调用拿到的结果,如果不需要外部修改列表,建议将返回值改为IReadOnlyList<Guid>,或者返回CacheList.AsReadOnly()的只读包装避免被意外篡改。
表达式体每次返回新实例的实现则没有这个问题,外部修改单个返回结果不会影响其他调用的返回值,如果业务上需要拿到独立可修改的列表,这种实现反而更符合需求。
内容的提问来源于stack exchange,提问作者user3724900
相关产品推荐
相关产品推荐

