Lambda表达式体属性与直接初始化的Guid定义差异解析
两段Guid定义代码的差异解析
先明确两段代码的语法形式:
第一段(表达式体只读属性):
private Guid DatabaseIdOne => Guid.Parse("e4d00000-7770-4e1b-8273-8e7afb12dd13");
第二段(字段初始化):
private Guid DatabaseIdTwo = Guid.Parse("e4d00000-7770-4e1b-8273-8e7afb12dd13");
你的理解是对的,第一段确实类似方法,每次访问时才会执行字符串解析,二者核心区别如下:
执行时机与次数
- 第一段是C# 6引入的表达式体只读属性,本质是封装了getter逻辑的属性。每次访问
DatabaseIdOne时,都会执行右侧的Guid.Parse方法,重新解析字符串生成Guid实例——哪怕字符串固定,解析过程也会重复执行。 - 第二段是字段初始化,在类实例被创建时(静态字段则是类型首次加载时)仅执行一次
Guid.Parse,生成的Guid实例会被存在字段中。后续访问DatabaseIdTwo时,直接返回这个已初始化好的实例,不会再触发解析逻辑。
- 第一段是C# 6引入的表达式体只读属性,本质是封装了getter逻辑的属性。每次访问
行为与性能差异
- 属性版(第一段):如果解析的字符串是动态变化的(比如从配置文件读取),每次访问都能拿到最新的解析结果;但固定字符串场景下,重复解析会带来微小的性能损耗。
- 字段版(第二段):初始化仅执行一次,后续访问直接取缓存的实例,性能更优;但如果字符串后续发生变更,字段的值不会自动更新,必须手动重新赋值才会生效。
本质类型区别
- 属性本质是包装了getter方法的成员,访问属性等同于调用方法执行逻辑;字段是类的直接存储成员,存储的是一个具体的Guid实例。
内容的提问来源于stack exchange,提问作者Mohamed Mohamud
相关产品推荐
相关产品推荐

