属性与方法

时间:2009-03-02 08:24:48

标签: c# properties methods

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

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

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

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

我会接受最全面和最全面的答案,但这也触及我所给出的榜样。

16 个答案:

答案 0 :(得分:124)

从“开发类库设计指南”的Choosing Between Properties and Methods部分:

  

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

答案 1 :(得分:50)

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

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

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

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

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

答案 2 :(得分:12)

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

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

在您的示例中,它是一个确定的属性。

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

答案 3 :(得分:12)

属性是一种从对象中注入或检索数据的方法。它们创建了类中变量或数据的抽象。它们类似于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";

答案 4 :(得分:9)

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

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

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

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

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

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

答案 5 :(得分:9)

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

  
      
  • 此操作是转化,例如Object.ToString
  •   
  • 操作非常昂贵,您希望与之通信   用户,他们应该考虑缓存   结果。
  •   
  • 使用get访问器获取属性值将具有可观察性   副作用。
  •   
  • 连续两次致电会员会产生不同的结果。
  •   
  • 执行顺序很重要。请注意,类型的属性应该   能够在任何设置和检索   顺序。
  •   
  • 该成员是静态的,但返回一个可以更改的值。
  •   
  • 该成员返回一个数组。返回数组的属性可以是   非常误导。通常是   必须退回的副本   内部数组使用户不能   改变内部状态。这个,耦合   事实上,用户可以轻松地   假设它是一个索引属性,   导致代码效率低下。
  •   

答案 6 :(得分:8)

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

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

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

考虑属性等属性。汽车有很多属性。颜色,MPG,模型等。并非所有属性都是可选的,有些是可计算的。

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

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

答案 7 :(得分:3)

我更喜欢使用带有 1 参数的添加/设置方法的属性。如果参数更多,请使用方法。

答案 8 :(得分:3)

属性应该只是简单设置并获得一个衬里。更多的东西,它应该真的移动到一个方法。复杂的代码应始终在方法中。

答案 9 :(得分:3)

我只使用属性进行变量访问,即获取和设置单个变量,或者在控件中获取和设置数据。只要需要/执行任何类型的数据操作,我就会使用方法。

答案 10 :(得分:3)

对于Properties来说,最重要的是在调试期间可以在Visual Studio中看到属性值。

答案 11 :(得分:2)

属性非常好,因为只要有访问权限,它们就可以在visual studio的可视化设计器中访问。

如果你只是设置和获取它们并且可能是一些不能访问大量代码的验证,那么它们就被使用了。请注意,因为在验证期间创建复杂对象并不简单。

其他任何方法都是首选方法。

这不仅仅是关于语义。使用不合适的属性开始在视觉工作室视觉设计师中出现奇怪。

例如,我在类的属性中获取配置值。配置类实际上打开一个文件并运行sql查询以获取该配置的值。这导致我的应用程序出现问题,配置文件将由visual studio本身而不是我的应用程序打开和锁定,因为它不仅是读取而是编写配置值(通过setter方法)。为了解决这个问题,我只需将其更改为方法。

答案 12 :(得分:2)

作为设计问题,属性表示类对象的数据或属性,而方法是类对象的动作或行为。

在.Net,世界中使用属性还有其他含义:

  • 属性用于数据绑定,而get_ / set_方法则不是。
  • XML序列化用户属性作为自然机制。
  • 属性由PropertyGrid控件和实习ICustomTypeDescriptor访问,如果您正在编写自定义库,则可以有效地使用它们。
  • 属性由Attributes控制,可以明智地使用它来设计面向方面的软件。

关于物业使用的误解(恕我直言):

  • 用于公开小型计算:ControlDesigner.SelectionRules的块块运行到72行!
  • 用于公开内部数据结构:即使属性未映射到内部数据成员,也可以将其用作属性(如果它是类的属性)。 Viceversa,即使它的类属性的属性是不可取的,也可以像数据成员一样返回数组(而不是使用方法返回成员的深层副本。)

在这里的示例中,它可以编写,具有更多的商业含义:

public String Title
{
    set { Label.Text = text; }
}

答案 13 :(得分:1)

以下是一套很好的指南,用于何时使用Bill Wagner中的属性与方法

  • 当所有这些都成立时使用属性: getter应该很简单,因此不太可能抛出异常。请注意,这意味着没有网络(或数据库)访问。要么失败,要么抛出异常。
  • 他们不应该彼此依赖。请注意,这将包括设置一个属性并使其影响另一个属性。 (例如,设置FirstName属性会影响组成第一个名称+姓氏属性的只读FullName属性意味着这样的依赖关系)
  • 它们应按任何顺序设置
  • getter没有可观察到的副作用注意本指南并不排除某些属性中的某些形式的惰性评估。
  • 该方法必须立即返回。 (请注意,这会排除进行数据库访问调用,Web服务调用或其他类似操作的属性。)
  • 如果成员返回数组,请使用方法。
  • 重复调用getter(不插入代码)应该返回相同的值。
  • 重复调用setter(具有相同的值)与单个调用没有任何区别。

  • get不应返回对内部数据结构的引用(参见第23项)。方法可以返回深层副本,并可以避免此问题。

*取自我对一个重复问题的回答。

答案 14 :(得分:0)

这很简单。

1:使用属性,当您希望在存储在字段中之前先对数据进行验证。因此,属性以这种方式为您的字段提供封装。因为如果您离开字段,公共最终用户可以根据您的业务需求分配任何可能有效或无效的值,例如年龄应大于18。因此在存储值之前,我们需要检查其有效性。这样,属性表示数据。

2:当您想要执行某些操作时使用方法,例如,您要提供一些数据作为参数,并且您的方法要根据提供的值进行处理,并返回处理后的值作为输出。或者您想通过此计算更改某些字段的值。 “通过这种方式,方法代表了行动”。

答案 15 :(得分:-1)

我来自java,我使用了get .. set ..方法一段时间。

当我编写代码时,我不会问自己:“访问这些数据很简单还是需要繁重的过程?” 因为事情可以改变(今天反过来这个属性很简单,tomonrow可能需要一些或繁重的过程)。

今天我有一个方法SetAge(int age)tomonrow我还将使用方法SetAge(date birthdate)来计算使用生日的年龄。

我对get和set中的编译器转换属性感到非常失望,但不认为我的Get ...和Set ..方法是一样的。