首页 > 解决方案 > 不同的静态只读属性实现(与字段)在 C# 中的行为如何?

问题描述

想问几个关于 .NET 平台在运行时如何在其内部工作中处理静态变量的问题。

注意:这是出于教育目的,而不是出于性能问题。

考虑以下三个变量定义:

using System;

public static class UserProperties
{
    public static Guid UserId1 { get { return new Guid("00000000-0000-0000-0000-000000000001"); } }

    public static Guid UserId2 { get; } = Guid.Parse("00000000-0000-0000-0000-000000000001");

    public static readonly Guid UserId3 = Guid.Parse("00000000-0000-0000-0000-000000000001");
}

第一:据我了解,使用UserId2over有一个好处UserId1,因为它不会在Guid每次访问属性时都实例化一个新的,而是将单个实例化分配给一个支持字段,只要程序正在运行,该字段就会被维护。这种理解正确吗?

第二:使用UserId3over有什么好处UserId2吗?我怀疑会有,因为前者本身就是一个字段,而后者是一个自动属性,我认为每次引用它时都会调用一个方法,但我不确定。

最后:如果确实存在差异(是的,在这个特定示例中可以忽略不计,但仍然存在),它们是否通过优化变得不存在 - 即编译器或 JIT 是否发出完全相同的指令?

谢谢!

标签: c#.netoptimizationlanguage-lawyer

解决方案


推荐阅读