将成员对象公开为 .NET 中的属性或方法
-
03-07-2019 - |
题
在 .NET 中,如果一个类包含一个类对象成员,那么该成员应该作为属性还是通过方法公开?
解决方案
如果您所做的只是暴露与当前对象状态相关的对象实例,则应使用属性。
当你有一些逻辑不仅仅是访问内存对象并返回该值,或者当你执行的操作对当前对象的状态有广泛影响时,应该使用一个方法。
其他提示
您应该对概念上表示对象状态的任何内容使用属性,只要其检索不是一个昂贵的操作,您应该避免重复使用它。
从 微软软件定义网络:
类库设计者通常必须决定是将类成员实现为属性还是方法。一般来说,方法代表动作,属性代表数据。使用以下指南来帮助您在这些选项之间进行选择。
当成员是逻辑数据成员时使用属性。在以下成员声明中,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 (); }
这与此事无关。
如果值是关于对象状态的一些细节,那么它应该是一个属性。
如果对对象执行某些操作,则应为Method。
性质。物业基本上只是一种“廉价”的方法。获取或设置对象的引用非常便宜。
为了澄清,属性通常应该代表对象的内部状态。但是,作为属性或方法的成员的实现告诉用户该调用可能有多昂贵。
属性读取并为类中的实例赋值。
方法对分配给该类的数据执行某些操作。
概述
一般来说,属性存储对象的数据,例如 姓名, ,方法是可以要求对象执行的操作,例如 移动 或者 展示. 。有时,哪些类成员应该是属性、哪些应该是方法并不明显 - 物品 集合类 (VB) 的方法存储和检索数据,并且可以作为索引属性来实现。另一方面,实施 物品 作为一种方法。
句法
类成员的使用方式也可能是决定它应该表示为属性还是方法的决定因素。从参数化属性检索信息的语法几乎与作为函数实现的方法所使用的语法相同。但是,修改此类值的语法略有不同。
如果将类的成员实现为属性,则必须按以下方式修改它的值:
ThisObject.ThisProperty(索引) = NewValue
如果类成员作为方法实现,则必须使用参数来修改要修改的值:
ThisObject.ThisProperty(索引,NewValue)
错误
尝试为只读属性赋值将返回与类似的方法调用不同的错误消息。正确实现的类成员会返回更容易解释的错误消息。
之前我对use属性和方法感到困惑。但现在我根据使用此规则MSDN指南:
方法表示动作,属性表示数据。属性意味着像字段一样使用,这意味着属性不应该在计算上复杂或产生副作用。如果它没有违反以下准则,请考虑使用属性而不是方法,因为经验不足的开发人员会发现更易于使用的属性。