在.NET中,如果一个类包含一个类对象的成员,那么该成员是应该作为属性公开还是使用方法公开?
答案 0 :(得分:18)
你应该使用属性来概念性地表示对象的状态,只要它的检索不够昂贵,你应该避免重复使用它。
来自MSDN:
类库设计者通常必须决定将类成员实现为属性还是方法。通常,方法表示动作,属性表示数据。使用以下准则可帮助您选择这些选项。
当成员是逻辑数据成员时使用属性。在以下成员声明中,Name是一个属性,因为它是该类的逻辑成员。
public string Name get { return name; } set { name = value; }
在以下情况下使用方法:
- 该操作是转换,例如Object.ToString。
- 操作非常昂贵,您希望与用户沟通,他们应该考虑缓存结果。
- 使用get访问器获取属性值会产生可观察到的副作用。
- 连续两次致电会员会产生不同的结果。
- 执行顺序很重要。请注意,应该能够以任何顺序设置和检索类型的属性。
- 该成员是静态的,但返回一个可以更改的值。
该成员返回一个数组。返回数组的属性可能会产生误导。通常需要返回内部数组的副本,以便用户无法更改内部状态。这与用户可以轻易地认为它是索引属性的事实相结合,导致代码效率低下。在下面的代码示例中,每次对Methods属性的调用都会创建数组的副本。结果,将在以下循环中创建2n + 1个阵列副本。
Type type = // Get a type. for (int i = 0; i < type.Methods.Length; i++) { if (type.Methods[i].Name.Equals ("text")) { // Perform some operation. } }
以下示例说明了属性和方法的正确用法。
class Connection { // The following three members should be properties // because they can be set in any order. string DNSName {get{};set{};} string UserName {get{};set{};} string Password {get{};set{};} // The following member should be a method // because the order of execution is important. // This method cannot be executed until after the // properties have been set. bool Execute (); }
答案 1 :(得分:11)
如果您所做的只是暴露与当前对象状态相关的对象实例,则应使用属性。
当你有一些逻辑不仅仅是访问内存对象并返回该值,或者当你执行的操作对当前对象的状态有广泛影响时,应该使用一个方法。
答案 2 :(得分:3)
这与此事无关。
如果值是关于对象状态的一些细节,那么它应该是一个属性。
如果对对象执行某些操作,则应为Method。
答案 3 :(得分:1)
性质。物业基本上只是一种“廉价”的方法。获取或设置对象的引用非常便宜。
为了澄清,属性通常应该代表对象的内部状态。但是,作为属性或方法的成员的实现告诉用户该调用可能有多昂贵。
答案 4 :(得分:1)
属性读取并为类中的实例赋值。
方法对分配给该类的数据执行某些操作。
答案 5 :(得分:1)
概述
通常,属性存储对象的数据,例如 Name ,方法是可以要求对象执行的操作,例如 Move 或 Show 的。有时候哪些类成员应该是属性并且哪些应该是方法并不明显 - 集合类(VB)的 Item 方法存储和检索数据,并且可以实现为索引属性。另一方面,将 Item 作为方法实现也是合理的。
语法
如何使用类成员也可能是决定它是否应该表示为属性或方法的决定性因素。从参数化属性检索信息的语法几乎与用作函数实现的方法的语法相同。但是,修改此类值的语法略有不同。
如果将类的成员实现为属性,则必须以这种方式修改它的值:
ThisObject.ThisProperty(Index)= NewValue
如果将类成员实现为方法,则必须使用参数修改要修改的值:
ThisObject.ThisProperty(Index,NewValue)
错误的
尝试将值分配给只读属性将返回与对方法类似调用不同的错误消息。正确实现的类成员返回更容易解释的错误消息。
答案 6 :(得分:0)
之前我对use属性和方法感到困惑。但现在我根据MSDN Guideline使用此规则:
方法表示动作,属性表示数据。属性意味着像字段一样使用,这意味着属性不应该在计算上复杂或产生副作用。如果它没有违反以下准则,请考虑使用属性而不是方法,因为经验不足的开发人员会发现更易于使用的属性。