属性与字段:需要帮助了解字段上属性的用法

首先,我已经阅读了关于该主题的帖子列表,并且由于我对封装和字段修饰符(私人,公共......等)的理解,我并不认为我已经掌握了属性。

我学习C#的一个主要方面是通过使用封装在代码中保护数据的重要性。 我'认为'我明白这是因为使用修饰语(私人,公共,内部,受保护)的能力。 然而,在了解了属性之后,我不仅在理解属性的使用方面存在困难,而且在理解C#中数据保护的整体重要性/能力(我认为是封装)。

更具体地说,当我在C#中使用属性时,所读到的所有内容都是当你可以使用它们代替字段时,因为:

1)它们允许您在直接直接访问字段时无法更改数据类型。

2)它们为数据访问增加了一层保护

然而,从我认为的我已经知道使用字段修饰符#2,在我看来,属性只是产生了额外的代码,除非你有理由改变类型(#1) - 因为你是(或多或少)创建隐藏的方法来访问字段而不是直接访问。

然后就是可以将所有修饰符添加到属性中,这进一步使我对需要属性访问数据的理解变得复杂。

我已经阅读了不同作者关于“属性”的许多章节,但没有一篇真正解释了对属性与字段与封装(以及良好编程方法)的良好理解。

有人可以解释:

1)为什么我想使用属性而不是字段(特别是当它出现我只是添加额外的代码

2)关于识别使用属性的任何提示,并且在跟踪其他人的代码时不要将它们视为简单的方法(除get; set显而易见)?

3)关于什么时候使用什么好的编程方法,有什么一般的经验法则?

谢谢你,并且很抱歉,这篇长文章 - 我不想问一个已经被问了100次的问题,而没有解释我为什么再次提出这个问题。


您不必担心通过属性访问字段所需的额外代码,它将由JIT编译器(通过内联代码)进行“优化”。 除非内联过大,否则你需要额外的代码。

用于定义简单属性的额外代码也很少:

public int MyProp { get; set; } // use auto generated field.

当您需要定制时,您可以稍后定义自己的领域。

所以你只剩下额外的封装/数据保护层,这是一件好事。

我的规则: 通过属性暴露字段


1)为什么我想使用属性而不是字段(特别是当它出现我只是添加额外的代码

您应该尽可能使用属性。 他们抽象直接访问该字段(如果您不创建一个字段,它将为您创建)。 即使财产除了设定价值之外别无他法,它仍然可以保护您。 稍后将字段更改为属性是一项重大改变,因此如果您有公共字段并希望将其更改为公共属性,则必须重新编译最初访问该字段的所有代码。

2)关于识别使用属性的任何提示,并且在跟踪其他人的代码时不要将它们视为简单的方法(除get; set显而易见)?

我并不完全确定你在问什么,但是在追查别人的代码时,你应该总是假定这个属性正在做一些其他的事情,而不仅仅是获取和设置一个值。 尽管在getter和setter中不要使用大量的代码是可以接受的,但是你不能仅仅假设它是一个属性,它会表现得很快。

3)关于什么时候使用什么好的编程方法,有什么一般的经验法则?

我总是使用属性来尽可能地获取和设置方法。 这样我可以在以后添加代码,如果我需要检查该值是否在某个范围内,而不是空值等。不使用属性,我必须返回并将这些检查放在我直接访问该字段的每个位置。


关于Properties的好处之一是getter和setter可以有不同的访问级别。 考虑这个:

public class MyClass {

  public string MyString { get; private set; }

  //...other code
}

这个属性只能从内部改变,比如在构造函数中。 阅读依赖注入。 构造函数注入和属性注入都处理来自某种形式的外部配置的设置属性。 那里有很多框架。 如果您深入了解其中的一些内容,您将会对其性能和使用有很好的感受。 依赖注入也可以帮助你解决关于良好实践的第三个问题。

在查看其他人的代码时,可以通过图标不同来判断某个方法或某个属性。 另外,在Intellisence中,属性摘要的第一部分是Property。

链接地址: http://www.djcxy.com/p/22889.html

上一篇: Properties vs. Fields: Need help grasping the uses of Properties over Fields

下一篇: How to display the array?