.net 是否所有具有返回值的方法都应转换为属性?
我刚才在想,既然.Net引入了属性,您是否希望将代码作为一个返回值的方法而不是只读属性的方法。如果它是一个无参数的方法,那么值得考虑迁移到属性,是的。如果它只是返回一个私有成员变量,那么它肯定应该是一个属性.net 是否所有具有返回值的方法都应转换为属性?,.net,.net,我刚才在想,既然.Net引入了属性,您是否希望将代码作为一个返回值的方法而不是只读属性的方法。如果它是一个无参数的方法,那么值得考虑迁移到属性,是的。如果它只是返回一个私有成员变量,那么它肯定应该是一个属性 但一般来说,不是每个返回值的方法都应该是属性。有些方法实例化对象并返回它们,而这些对象永远不应该是属性。有些方法返回这个,允许使用“流畅”的API。这些都不应该是属性 不,他们不应该。 例如,不应将返回某些内容并执行昂贵操作的方法修改为属性 无法将采用参数的方法转换为属性 例如,不应将返回数
但一般来说,不是每个返回值的方法都应该是属性。有些方法实例化对象并返回它们,而这些对象永远不应该是属性。有些方法返回
这个,允许使用“流畅”的API。这些都不应该是属性 不,他们不应该。
例如,不应将返回某些内容并执行昂贵操作的方法修改为属性
无法将采用参数的方法转换为属性
例如,不应将返回数组的方法转换为属性。这是因为在这种情况下,您应该返回数组的副本,以禁止有人在类之外修改数组。
当您使用返回数组副本的属性时,程序员更可能编写如下内容:
foreach( var x in myClass.PropertyThatReturnsArray )
{
}
对于每次迭代,都将创建一个新的数组副本。
相反,如果您将此作为一种方法编写,程序员更可能编写以下内容:
var foo = myClass.GetTheArray();
foreach( var x in foo )
{
}
(这是fxcop已强制执行的规则:)
这是一个心理问题 没有。我建议看一下:
类库设计者通常必须
决定是否实现一个类
作为属性或方法的成员。在里面
一般来说,方法代表动作和动作
属性表示数据。使用
下面的指南可以帮助你
在这些选项之间进行选择
- 当成员是逻辑数据成员时,请使用属性。在下面
成员声明,名称为
属性,因为它是逻辑
班上的一员
- 在以下情况下使用方法:
- 该操作是一种转换,例如Object.ToString
- 该操作非常昂贵,您需要与
用户应该考虑缓存
结果呢
- 使用get访问器获取属性值将具有
明显的副作用
- 连续两次调用成员会产生不同的结果
- 执行顺序很重要。请注意,类型的
属性应该可以设置
并以任何顺序检索
- 该成员是静态的,但返回一个可以更改的值
- 该成员返回一个数组。返回数组的属性可以是
非常误导。通常是这样
需要返回一份
内部数组,因此用户无法
改变内部状态。这个,耦合
用户可以轻松地
假设它是一个索引属性,
导致代码效率低下。在
下面的代码示例,每个调用
Methods属性创建
阵列。因此,2n+1份
数组将在中创建
跟随循环
@弗雷德里克。我几乎仍然认为这是一个财产。我已经这样做了好几次,但在文档中我声明这是一个集合的副本。我想到的是.Net拥有的集合类,例如Dictionary,键和值都作为属性公开。谢谢你的评论。@Frederik。对于为foreach
语句的每次传递创建数组的新实例,您是错误的。系统创建一个状态机,只检索属性值一次。请参阅我在的回答,以了解foreach
如何在内部工作。Matthew:我从来没有说过foreach在每次传递时创建数组的副本。我是说返回数组的属性应该返回该数组的副本;换句话说:程序员应该确保返回数组的副本,而不是(内部)数组本身。通过这样做,您可以确保数组(由类内部持有的数组)不能被其他人在类之外修改。另请参见FxCop规则CA1819。@uriDium:我不是说“集合”。我特别要说的是数组。那不是同样的情况…@Gorpik。但这改变了问题,使兰多尔夫看起来像个白痴。他怎么看不懂这个问题。@uriDium:不,没有,因为你在评论中澄清了情况。突然改变一个问题是不好的;添加一些您忘记的信息是好的。它会帮助其他人给你一个答案。当然,Randolpho可以编辑他的答案以匹配您的重新措辞,尽管我认为它仍然适用(无参数部分很重要,所以他可能会在他的答案中强调它)。几年前,我第一次阅读MS的“类库开发人员设计指南”,那是在.Net 1.1版。这是一本非常有用的参考书,可以从头读到尾,放在你的后口袋里。