C#中的属性或变量
可能重复:
属性与字段:需要帮助掌握属性对字段的使用。
我在课堂上看过属性和变量。
你能告诉我们我们使用哪种情况属性以及我们使用变量的场景。
通常,无论如何,属性都由变量支持 。 即使你有一个自动实现的属性,如下所示:
public string Name { get; set; }
幕后仍有变数。 并非所有属性都由变量支持(例如DateTime.Now
),但绝大多数属性都是。
实际上,您应该始终使用属性来访问其他类型的数据,而不是公开变量。 (换句话说,变量本身应该是私有的。)这样你就可以将类的API与其实现分开……确切地说,类存储数据的方式应该只涉及类本身。
如果您只引用类本身中的一段数据,则根本不需要属性,除非您想要在更改它时执行validation,或者类似的事情。
在通过属性公开变量之前,值得仔细思考 – 如果你只是一直这样做,你会失去一定数量的封装; 类型通常不应该只是由其他代码操纵的数据集合。 他们应该使用其中的数据来公开更高级别的操作。 这有点难以描述,我并不是说这些属性本身就不好 – 只是如果你不小心它们就会被过度使用。
通常,最好创建公共属性和私有变量。
公共变量的原因很少。
[需要属性的示例是设置对象属性并且还引发事件以通知订阅者更改]。
可能有很多场景使用变量和属性之间存在差异。 通常变量用于类的内部工作,而类不应该公开变量,换句话说,属性是从其他类访问的。
此外,一些代码生成和工具要求您定义变量或属性。 例如,在XAML(WPF和Silverlight)中,您必须公开依赖项属性的变量。
此外,由于属性是用于获取或设置值的代码,因此它们甚至可用于提供对存储在其他地方的内容的访问,而不是内部类变量。 例如,您可以定义一个允许将UI片段绑定到文本文件内容的属性。
你不必“使用”字段而不是“属性”,字段实际上在运行时更快。
但是,通常您需要在类上将实例变量定义为Properties。 这使您可以使用Fields做一些额外的事情。
- 可以是只读或只写
- 可以像方法一样包含在接口中
- 可能有副作用。
您的类的接口可以使许多事情变得更容易,包括测试和维护。
public interface IStudentGroup { List NameList { get; } }
副作用是最有用的function之一。 假设您有一个名为Items的属性,其中包含一个集合。 如果它为null,您可能希望自动初始化它。 例如:
private List namesList; public List NameList { { get { if ( namesList == null ) namesList = new List (); return namesList; } }
为了完整性我想添加(来自msdn )
属性不应该是计算复杂或产生副作用
因此,对于计算复杂的操作或具有副作用的情况,编写GetX(), SetX()
方法而不是使用属性
属性getter应该是简单的操作,没有任何先决条件。 如果getter可能抛出exception,请考虑将该属性重新设计为方法。 此建议不适用于索引器。 由于参数无效,索引器可能会抛出exception。