C#-what';有什么区别

C#-what';有什么区别,c#,class,oop,properties,methods,C#,Class,Oop,Properties,Methods,可能重复: 在方法中,您也可以键入一些代码和属性。例如,我有一个属性名。当类名更改时,我希望从数据库中获取一些数据并更改对象的状态。我可以添加此代码来设置我的部分属性。另一个解决方案是将set part更改为private,并添加名为SetName的方法,然后在此方法中添加我的代码 那么有什么区别呢?什么时候将一些代码放入getter/setter不好,什么时候创建自己的方法用于更改我的属性和类的其他部分?给定这样的属性 private string _name; public string

可能重复:

在方法中,您也可以键入一些代码和属性。例如,我有一个属性名。当类名更改时,我希望从数据库中获取一些数据并更改对象的状态。我可以添加此代码来设置我的部分属性。另一个解决方案是将set part更改为private,并添加名为SetName的方法,然后在此方法中添加我的代码


那么有什么区别呢?什么时候将一些代码放入getter/setter不好,什么时候创建自己的方法用于更改我的属性和类的其他部分?

给定这样的属性

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; }
行为相同。事实上,这正是编译器在创建属性时为您所做的


一般来说,当属性中的代码开始感到“昂贵”时,如果这有意义的话,我会避开属性。我希望属性感觉像字段(具有在特定时间发生的受控副作用),因此它们应该是轻量级的。

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

设计指南指出,当您实现的功能非常昂贵时,应该优先选择方法而不是属性


事实上,一个属性被实现为一个或两个方法;取决于属性是否具有setter。属性被转换为get\u xxx和set\u xxx方法。

每当我遇到需要将代码放入getter/setter时,我都将代码放入私有方法,并从getter/setter中调用该方法。这样,如果我在其他地方需要代码,代码就可以在方法调用中使用。不确定这是否是您所寻求的答案,但这只是我使用的一种方法。

本质上,属性是一对方法-getProperty和setProperty。这只是事情的惯例/简化


假设属性getter没有任何副作用(好吧,它们可能有某些副作用,比如延迟加载)。

这里有一套很好的指南,用于指导何时使用属性和方法(固定链接)

  • 当所有这些都为真时,请使用属性: getter应该很简单,因此不太可能抛出异常。请注意,这意味着没有网络(或数据库)访问权限。任何一个都可能失败,因此会引发异常
  • 它们不应该相互依赖。请注意,这将包括设置一个属性并使其影响另一个属性。(例如,设置FirstName属性将影响由first name+last name属性组成的只读全名属性,这意味着这种依赖关系)
  • 它们应该可以按任何顺序设置
  • getter没有可观察的副作用。注意:本指南并不排除属性中某些形式的惰性计算
  • 该方法必须始终立即返回。(请注意,这排除了进行数据库访问调用、web服务调用或其他类似操作的属性)
  • 如果成员返回数组,请使用方法
  • 对getter的重复调用(没有插入代码)应该返回相同的值
  • 对setter的重复调用(使用相同的值)应该不会产生与单个调用不同的结果

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


这可能不是最重要的区别,但其中一个区别是调试器可以配置为跳过属性(假设它们的代码微不足道)。

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

getter和setter在内部被转换为标准方法,这样运行时就不知道某个getter或setter是否与某个属性相关联。术语syntacticssugar通常用于这些方便的构造

然而,软件工程有一个重要的好处:如果您限制自己使用getter和setter以及get和set语义,那么代码往往更容易理解。即,仅执行提供相应财产所需的步骤

做一些额外工作的一个常见用例是设置或获取一个不直接由成员字段支持的属性。例如,有一个类包含一个表示距离的值。您的类可以提供两个属性:km和Miles以及各自的setter和getter。然后在一对中进行简单的转换,并保存自己以存储两次值


一般来说,您不应该在getter中放入任何有副作用的代码。此外,setter中的代码应该具有的唯一副作用是setter所指对象的状态发生变化。

想想看,属性不仅仅是语法上的糖分。它们是您的成员数据对您的成员代码的公开面

因此,为从代码中检索或输入成员数据的单个方面提供了一个干净的层

例如,DTO就是一堆写得很好的属性,可以有效地分解数据和行为。 如果没有DTO,您会想象将数据网格或下拉列表紧密耦合到复杂的业务逻辑方法吗

简单地说,方法实际上是在做工作……属性要么激发动作,要么获得状态


不过,您可以在属性中使用方法代码……这不是它们的用途。甚至,如果必须这样做,最好对属性中的另一个方法进行干净的调用,而不是实际在其中编写代码。嗯

+1,用于将其称为guidlines而不是rules