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

Tom*_*ski 35 c# oop methods properties class

可能重复:
属性与方法

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

那么区别是什么呢?什么时候把一些代码放到getter/setter并且何时创建自己的方法来改变我的属性和我的类的其他部分是不合适的?

Chr*_*nce 54

这里有一套关于何时使用Bill Wagner的属性vs方法的指南(固定链接)

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

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

  • 不允许:"设置FirstName属性会影响组成第一个名称+姓氏属性的只读FullName属性意味着这样的依赖"哦,这对我来说是新的.我经常使用这个贴纸.像只读属性范围=得到最大 - 最小.我认为这是一个快速/简单的操作,可以用作属性.所以我有点不同意这一点. (5认同)
  • +1用于调用guidlines而不是规则 - 例如,延迟加载OR映射器通常违反了许多此指南. (2认同)

pli*_*nth 12

鉴于这样的财产

private string _name;
public string Name { get { return _name; } set { _name = value; } }
Run Code Online (Sandbox Code Playgroud)

可以编写以下两种方法:

public string get_Name() { return _name; }
public void set_Name(string value) { _name = value; }
Run Code Online (Sandbox Code Playgroud)

行为相同.事实上,这正是编译器在创建属性时为您所做的事情.

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


Fre*_*els 8

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

设计指南指出,当您实现的功能很昂贵时,应该优先考虑某个属性.

实际上,一个属性被实现为一种或两种方法; 取决于您的财产是否有安装者.该属性被转换为get_xxx和set_xxx方法.