代码之家  ›  专栏  ›  技术社区  ›  123Developer

C 3.0中自动属性和公共字段的区别

  •  16
  • 123Developer  · 技术社区  · 16 年前

    我无法理解为什么C 3.0中存在自动实现的属性语言功能。

    你说的话有什么不同

    public string FirstName;
    

    public string FirstName { get; set; }
    
    7 回复  |  直到 10 年前
        1
  •  20
  •   Charles Bretana    16 年前

    因为它们在生成的IL代码(和机器语言)中的实现方式不同。自动属性仍然公开为公共getter和setter,而公共字段只是一个单独的字段。

    因此,实现auto属性允许您在以后更改getter或setter的内部行为(例如添加验证器),而无需重新编译或重新编码任何使用它的依赖类…

        2
  •  9
  •   tranmq    16 年前

    除了其他人所说的声明公共字段之外,该字段还可以进行读写访问。声明公共自动属性,尽管该属性是公共的,但仍可以添加修饰符来控制get/set级别的可访问性。

    public string FirstName { get; private set; }
    

    类的用户将firstname视为公共财产。但是,他/她不能给它写信。

        3
  •  5
  •   Jon Skeet    16 年前

    考虑一下,如果您以后想用自定义实现将它们中的每一个更改为一个属性,会发生什么。如果它是自动实现的属性,只需添加一个字段并更改实现。完整的源代码和二进制兼容性。

    如果这是一个领域,你就得不到任何来源。 也不 二进制兼容性。您必须重建引用它的所有内容,并修复不再编译的任何内容。

    此外, properties have various benefits over fields . 我个人对菲尔兹的主要反对意见是它暴露了 实施 API中的决策。

        4
  •  2
  •   Lasse V. Karlsen    16 年前

    不同之处在于,用读取属性的代码编译的其他程序集是根据属性编译的。

    如果您稍后决定需要向getter或setter添加代码,则可以这样做,而不必强制与之链接的每个其他程序集重新编译。

    而对于字段则不是这样。如果稍后将字段更改为属性,为了添加该代码,与您的字段链接的其他程序集将停止正常工作,因为它们被编译为读取字段,而不是属性。

    此外,编写许多代码是为了查找属性,而不是字段,如数据绑定和类似的内容。

        5
  •  2
  •   Avram    16 年前

    因为这个用途:
    public string FirstName { get; private set; }
    简单的财产,按照OO规则,那是“犹太洁食”

        6
  •  0
  •   Cameron MacFarland    16 年前

    第一个是公共领域,第二个是公共财产。

    主要区别在于它们的使用方式。例如,WPF只能将数据绑定到属性,而不能绑定到字段。

        7
  •  0
  •   Ariel Popovsky    16 年前

    自动属性是编译器生成的常规属性,它们使用类似于任何常规属性的支持字段,但您不需要为此编写代码。这是一个很有说明性的例子(感谢 Reflector )编译器生成的代码:

    [CompilerGenerated]
    private string <ContentType>k__BackingField;
    
    public string ContentType
    {
        [CompilerGenerated]
        get
        {
            return this.<ContentType>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            this.<ContentType>k__BackingField = value;
        }
    }
    
    推荐文章