当前位置:  开发笔记 > 编程语言 > 正文

属性与方法

如何解决《属性与方法》经验,为你挑选了7个好方法。

快速提问:您何时决定使用属性(在C#中)以及何时决定使用方法?

我们正在忙着进行这场辩论,并且发现了一些我们应该使用财产或方法存在争议的领域.一个例子是:

public void SetLabel(string text)
{
    Label.Text = text;
}

在该示例中,Label是ASPX页面上的控件.是否有一个原则可以控制决策(在这种情况下)是否将其作为方法或财产.

我会接受最全面和最全面的答案,但这也触及了我给出的例子.



1> Ken Browning..:

从"开发类库的设计指南"中的" 选择属性和方法"部分:

通常,方法表示动作,属性表示数据.属性意味着像字段一样使用,这意味着属性不应该在计算上复杂或产生副作用.如果不违反以下准则,请考虑使用属性而不是方法,因为经验不足的开发人员会发现属性更易于使用.


Mystere Man改变颜色是期望的效果而不是副作用.副作用不是主要行动中的意思.
虽然我同意其中的大部分内容,但我不认为有关副作用的部分是正确的.例如,"颜色"通常是对象的属性,它具有明显的副作用(改变对象的颜色).改变属性具有改变对象状态的明显副作用.
@Mystere Man:definelty改变颜色不是副作用,我完全赞同这个答案
属性与方法的内部实现有什么区别?每当使用属性时,是否会将任何东西压入调用堆栈?如果没有,该如何处理?

2> cletus..:

是的,如果您正在进行和设置,请使用属性.

如果您正在做一些可能影响多个数据成员的复杂事情,那么方法更合适.或者,如果你的getter接受参数,或者你的setter需要多于一个value参数.

中间是一个灰色区域,线条可能有点模糊.没有硬性和快速的规则,不同的人有时会不同意某些东西应该是属性还是方法.重要的是与你的工作方式(或者你的团队如何做到)(相对)一致.

它们在很大程度上是可互换的,但属性向用户发出信号,表明实现相对"简单".哦,语法更清晰一点.

一般来说,我的理念是,如果你开始编写一个以get或set开头并且分别获取零个或一个参数的方法名称,那么它就是一个属性的主要候选者.



3> Robin Day..:

如果您要设置对象的实际属性,则使用属性.

如果您正在执行任务/功能,则使用方法.

在您的示例中,它是一个确定的属性设置.

但是,如果您的功能是AppendToLabel,那么您将使用一种方法.



4> Chuck Conway..:

属性是一种从对象中注入或检索数据的方法.它们创建了类中变量或数据的抽象.它们类似于Java中的getter和setter.

方法封装了一个操作.

通常,我使用属性来暴露单个数据位,或者对类进行小型计算,例如销售税.这是从购物车中的物品数量和成本得出的.

我在创建操作时使用方法,比如从数据库中检索数据.任何具有移动部件的操作都是方法的候选者.

在你的代码示例中,如果我需要在它包含类的外部访问它,我会将它包装在一个属性中:

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

设置文字:

Title.Text = "Properties vs Methods";

如果我只是设置Label的Text属性,我就是这样做的:

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

设置文字:

Title = "Properties vs Methods";



5> Gavin Miller..:

通过MSDN搜索,我找到了一个关于Properties vs Methods的参考,它为创建方法提供了一些很好的指导:

该操作是转换,例如Object.ToString.

操作非常昂贵,您希望与用户通信他们应该考虑缓存结果.

使用get访问器获取属性值会产生可观察到的副作用.

连续两次调用该成员会产生不同的结果.

执行顺序很重要.请注意,应该能够以任何顺序设置和检索类型的属性.

该成员是静态的,但返回一个可以更改的值.

该成员返回一个数组.返回数组的属性可能会产生误导.通常需要返回内部数组的副本,以便用户无法更改内部状态.这与用户可以轻易地认为它是索引属性的事实相结合,导致代码效率低下.



6> Muhammad Has..:

语义属性是对象的属性.方法是对象的行为.

Label是一个属性,使它成为属性更有意义.

在面向对象编程方面,您应该清楚地了解什么是行为的一部分,什么只是一个属性.

汽车{颜色,型号,品牌}

汽车具有颜色,型号和品牌属性,因此拥有方法SetColor或SetModel没有意义,因为在语法上我们不要求Car设置自己的颜色.

因此,如果您将属性/方法案例映射到现实生活对象或从语义视点查看它,您的困惑将真正消失.



7> Erik Funkenb..:

你只需要看一下这个名字......"财产".这是什么意思?字典以多种方式定义它,但在这种情况下,"事物的基本或独特属性或质量"最合适.

想想行动的目的.事实上,你是在改变或检索"一个必要或独特的属性"吗?在您的示例中,您正在使用函数来设置文本框的属性.这看起来有点傻,不是吗?

属性确实是函数.它们都编译成getXXX()和setXXX().它只是将它们隐藏在语法糖中,但它的糖为过程提供了语义含义.

想想属性这样的属性.汽车有很多属性.颜色,MPG,模型等.并非所有属性都是可选的,有些是可计算的.

同时,方法是一种行动.GetColor应该是一个属性.GetFile()应该是一个函数.另一个经验法则是,如果它不改变对象的状态,那么它应该是一个函数.例如,CalculatePiToNthDigit(n)应该是一个函数,因为它实际上并没有改变它附加到的Math对象的状态.

这可能是漫无目的,但它确实归结为决定你的对象是什么,以及它们代表什么.如果你无法弄清楚它是否应该是一个属性或功能,也许无关紧要.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有