Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否所有具有返回值的方法都应转换为属性?_.net - Fatal编程技术网

.net 是否所有具有返回值的方法都应转换为属性?

.net 是否所有具有返回值的方法都应转换为属性?,.net,.net,我刚才在想,既然.Net引入了属性,您是否希望将代码作为一个返回值的方法而不是只读属性的方法。如果它是一个无参数的方法,那么值得考虑迁移到属性,是的。如果它只是返回一个私有成员变量,那么它肯定应该是一个属性 但一般来说,不是每个返回值的方法都应该是属性。有些方法实例化对象并返回它们,而这些对象永远不应该是属性。有些方法返回这个,允许使用“流畅”的API。这些都不应该是属性 不,他们不应该。 例如,不应将返回某些内容并执行昂贵操作的方法修改为属性 无法将采用参数的方法转换为属性 例如,不应将返回数

我刚才在想,既然.Net引入了属性,您是否希望将代码作为一个返回值的方法而不是只读属性的方法。如果它是一个无参数的方法,那么值得考虑迁移到属性,是的。如果它只是返回一个私有成员变量,那么它肯定应该是一个属性


但一般来说,不是每个返回值的方法都应该是属性。有些方法实例化对象并返回它们,而这些对象永远不应该是属性。有些方法返回
这个
,允许使用“流畅”的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版。这是一本非常有用的参考书,可以从头读到尾,放在你的后口袋里。