方法与C#中的属性 – 有什么区别

可能重复:
属性与方法

在方法中,你也可以input一些代码和属性。 例如我有一个属性名称。 当类名更改时,我想从数据库中获取一些数据并更改我的对象的状态。 我可以添加这个代码来设置我的属性的一部分。 其他解决scheme是将set part更改为private,并添加名为SetName的方法,并在此方法中添加我的代码。

那么区别是什么呢? 什么时候把getter / setter的一些代码和创build自己的方法用来改变我的属性和我的类的其他部分是不好的?

这是一个很好的指导方针 ,何时使用比尔·瓦格纳的属性与方法(固定链接)

  • 当所有这些都是真的时候使用属性:getters应该是简单的,因此不太可能抛出exception。 请注意,这意味着没有networking(或数据库)访问。 要么可能会失败,因此会抛出exception。
  • 他们不应该有彼此依赖。 请注意,这将包括设置一个属性,并影响另一个属性。 (例如,设置FirstName属性会影响只读的FullName属性,该属性包含名字+姓氏属性意味着这种依赖关系)
  • 它们应该以任何顺序设置
  • 吸气剂没有明显的副作用注意这个指导方针并不排除一些属性的惰性评估forms。
  • 该方法必须总是立即返回。 (请注意,这排除了进行数据库访问调用,Web服务调用或其他类似操作的属性)。
  • 如果成员返回一个数组,则使用方法。
  • 重复调用getter(不插入代码)应返回相同的值。
  • 对二传手的重复呼叫(具有相同的值)应该不会影响单个呼叫。

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

给定这样的属性

private string _name; public string Name { get { return _name; } set { _name = value; } } 

有可能写出以下两种方法:

 public string get_Name() { return _name; } public void set_Name(string value) { _name = value; } 

其行为相同。 事实上,这正是编译器在创build属性时为您做的。

一般来说,当他们内部的代码开始觉得“昂贵”时,我会远离属性,如果这是有道理的。 我希望属性感觉像字段(在特定时间发生控制的副作用),所以他们应该是轻量级的。

财产不过是一些句法糖。 在某些情况下,最好定义一个属性而不是方法,因为它更清晰/更具可读性。

devise准则规定,当你正在实现的function是昂贵的,一个方法应该优于一个属性。

实际上,财产是作为一个或两个方法来实现的; 取决于你的财产是否有一个二传手。 该属性被翻译成一个get_xxx和一个set_xxx方法。

每当我遇到需要把代码放在getter / setter中时,我把代码放在一个私有方法中,并从getter / setter中调用该方法。 这样的代码是可用的方法调用,我应该在别处需要它。 不知道这是你正在寻找的答案,但它只是一个我使用的方法。

想起来,属性不仅仅是语法糖。 他们是你的会员资料的公开面对你的会员代码。

因此,给你一个干净的图层来检索或input来自你的代码的单一方面的成员数据。

例如DTO只不过是一堆写得很好的属性,可以有效地分割数据和行为。 如果没有DTO,您会想象将DataGrid或Dropdown紧密地耦合到复杂的业务逻辑方法吗?

简而言之,方法实际上是在做这个工作……属性要么是煽动行动,要么是获得地位。

虽然,你可以在你的属性中使用方法代码…这不是他们的意思。 甚至,如果你不得不在你的代码中写一个干净的调用另一个方法的属性。 HTH!

本质上属性是几个方法 – getProperty和setProperty。 这只是事物的约定/简化。

假定属性获取器没有副作用(好 – 它们可能有一定的副作用,如延迟加载)。

这可能不是最重要的区别,但其中一个区别是debugging器可以configuration为跨越属性(假设他们的代码很简单)。

基本上没有区别(setter中的保留标识符“value”除外)。

Getters和setter被内部翻译成标准方法,使得运行时不知道某个getter或setter是否与某个属性相关联。 术语语法糖通常用于像这样的便利构造。

但是,有一个重要的软件工程好处:如果限制自己使用获取和设置语义的getter和setter,则代码会更容易理解。 即只做必要的步骤来提供相应的财产。

进行一些额外工作的一个常见用例是例如设置或获取不直接由成员字段支持的属性。 例如,你有一个包含一个表示距离的值的类。 你的class级可以提供两个属性:公里和英里,分别设置和取消。 然后,你会做一对简单的转换,并保存自己的价值两次存储。

作为一般的经验法则,你不应该把任何代码放在有副作用的getter中。 而且,setter中代码的唯一副作用就是setter所引用对象的状态变化。

方法做一些事情。 这就是为什么他们通常在那里有动词的地方。

属性返回数据。

这条线很简单,如果一个属性除了访问类的内部数据存储之外,应该成为一个方法。

例如,如果您是一个名为NumberOfQuetions属性的用户。 如果它必须去数据库得到应该是一个方法的问题的数量。 如果它正在返回一个内部商店,即使内部商店有一些逻辑完成,你也可以保留这个内部商店。