快速问题:当你决定使用特性(C#)当你决定使用方法?

我们正忙着具有这一辩论,并发现某些领域里,这是值得商榷我们是否应该使用财产或方法。一个例子是这样的:

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

在该实例中, Label 是控制在一个ASPX页。是有一个原则,即可以管理的决定(在这种情况下)是否要使这一方法或财产。

我会接受的答案,是最普遍和全面,但也涉及在例,我已经给出。

有帮助吗?

解决方案

来自在属性和方法之间进行选择开发类库设计指南的一部分:

  

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

其他提示

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

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

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

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

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

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

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

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

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

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

通过搜索MSDN,我发现了一个参考上 性vs的方法 这提供了一些伟大的指南,用于创建方法:

  • 作为一个转换,例如 Object.ToString.
  • 操作是昂贵的,你想要沟通 用户,他们应该考虑缓存 结果。
  • 获得的财产价值的使用得到的访问将有可观察到的 副作用。
  • 呼吁成员连续两次产生不同的结果。
  • 为执行是重要的。注意这一类型的属性应该 能够集和检索任何 顺序。
  • 成员是静态的,而是返回价值,可以改变的。
  • 成员返回的一个阵列。性返回阵列可以 非常误导。通常是 需要回报的副本 内部阵列,以便对用户不能 改变内部的状态。这一点,再加 与这一事实,用户可以轻松 假设它是一种索引的财产, 导致效率低下的代码。

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

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

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

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

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

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

您只需要查看名称...“Property”即可。这是什么意思?字典以许多方式定义它,但在这种情况下,“事物的基本或独特属性或质量”。最合适。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

作为设计属性代表的数据或特性的类对象,而方法的行动或行为的类对象。

中。净,世界上还有其他影响使用性能:

  • 性别中使用的数据绑定,同时get_/set_方法都没有。
  • XML化用户性质的自然机构的serilization.
  • 性访问 PropertyGrid 控制和实习生 ICustomTypeDescriptor, ,这可以有效地使用,如果你正在写一个自定义的图书馆。
  • 性控制的 属性, 一可以明智地使用它,以设计面向方面的软件。

误解(恕我直言)关于特性'的使用情况:

  • 用于获得小小的计算: ControlDesigner.SelectionRules's得到块运到72线!
  • 用来揭露内部数据结构:甚至如果财产并不线图的一个内部数据的部件,一个可以使用它作为财产,如果其属性的。反之亦然,即使其属性的类属性是不可取的,返回阵列类的数据成员(而不是方法被用于返回的深复制的成员。)

在这里的示例有可能是书面的,与更多的商业意义为:

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

这是一套很好的 准则 对于何时使用性vs的方法 比尔*瓦格纳

  • 使用财产时,所有这些都是真实的:该吸气应该是简单并因此不可能扔的例外情况。注意,这意味着没有的网络(或数据库)的访问。要么可能会失败,因此会引发一个例外。
  • 他们不应该依赖于各方。注意,这将包括设置一个属性和具有影响的另一个。(例如,设置FirstName属性会影响一个只读FullName财产,组成第一名+最后一名性质意味着这种依赖性)
  • 他们应可在任何顺序
  • 吸气不具有可观察到的副作用,注意到这个准则不排除一些形式的偷懒评价财产。
  • 该方法必须总是立即返回。(注意,这就排除了一个属性,使得一个数据库的访问通话、网服务电话或其他类似的操作)。
  • 使用的方法如果成员返回的一个阵列。
  • 反复呼吁的气剂(而不干预代码)应该返回相同的价值。
  • 重复,呼叫器(具有相同的价值)应收率没有差别从一个单一的呼吁。

  • 该获得应该不会返回一个参考的内部数据结构(见项目23).一个方法可以返回的一个深刻的复制,并可能避免这一问题。

*从我的答案的一个重复问题。

这很简单。

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top