【问题标题】:Difference between Property and Method [duplicate]属性和方法之间的区别
【发布时间】:2011-02-02 10:26:54
【问题描述】:

例如,在返回值方面使用哪个更好

public int EmployeeAge
{
    get{return intEmployeeAge};
}

还有

public int EmployeeAge()
{
    return intEmployeeAge;
}

哪个更好,为什么?当我们有上述 secnario 时,最好的编程实践是什么?

【问题讨论】:

    标签: c# properties methods


    【解决方案1】:

    一个方法在工作完成后返回值,一个值是工作完成的结果。我不认为这是你在做的。

    属性(访问器)用于返回变量,这似乎是您想要实现的目标:

    根据MSDN

    属性的访问器包含 相关的可执行语句 获得(阅读或计算)或 设置(写入)属性。这 访问器声明可以包含一个 get 访问器,set 访问器,或两者兼而有之。 声明采用以下内容 表格:

    public int EmployeeAge
    {
        get;
        set;
    }
    

    有一个look here,因为它很好地描述了这些的用途。

    【讨论】:

      【解决方案2】:

      我认为这与您正在编程的文化有很大关系。在我看来,C# / .NET 文化在这种情况下更喜欢使用属性

      我的建议:尽量与您使用的主要库保持一致。

      但是:小心使用属性(或用于相同目的的函数,如您上面的示例),因为它们通常是糟糕设计的标志。你想告诉你的对象做事,而不是询问他们提供信息。不过,不要对此抱有宗教色彩,请注意这是一种代码气味。

      【讨论】:

      • 文化?没明白你的意思,因为在这两种情况下它都只返回员工年龄。
      • 我所说的文化是指语言/平台附带的代码主体、使用它们的开发人员社区以及他们创建的库。
      • 我不明白您的代码异味参考。一个复杂的对象可能有很多属性,特别是如果它有多个祖先......
      • @Dining Philanderer:当然可以。但要小心这些物体。确保你确定它需要是什么,因为拥有大量属性可能是糟糕设计的标志。属性往往会产生依赖关系和复杂的 if/else 代码。
      【解决方案3】:

      如果您只需要返回一个值,请使用属性。

      如果您需要在返回值之前某事,请使用函数。

      【讨论】:

      • 但是在属性的情况下,我也可以在属性的返回值之前添加一些你称之为“做某事”的处理,在上述情况下,两者都是返回值。但哪个更好?
      • 是的,你可以,但你需要考虑含义。大多数程序员,在调用一个属性时并不期望它改变对象状态,但在调用一个函数时他们确实期望这个。
      【解决方案4】:

      属性是表达对象特性的一种有用方式,允许以数据绑定、反射和序列化等 API 可以使用的通用方式获取/设置。所以对于对象的简单,属性很方便。属性不能接受参数,不应该有明显的副作用*,并且应该快速且可重复地返回。此外,没有“扩展属性”(镜像扩展方法)或通用属性之类的东西。

      (不过,*=延迟加载等并不少见)

      方法(C# 没有函数)更适合表达改变状态的事物,或者期望花费一些时间且不一定可重现的事物。他们不倾向于在绑定/序列化等方面工作。

      请注意,属性实际上只是编写方法的一种特殊方式。 功能差别不大。这一切都是为了表达意图。但是,不想 公开的一件事是 fields(实际的 intEmployeeAge 实例变量)。

      所以我会:

      public int EmployeeAge { get{return intEmployeeAge}; }
      

      或者只是(如果在Employee 对象上):

      public int Age { get{return intEmployeeAge}; }
      

      当然……那么问题就变成了“在什么单位?”我假设那是几年?

      【讨论】:

      • /同意。以一种简单的方式,属性被设计为在类外部公开私有字段,以确保在修改类架构时不会发生重大变化。
      • @JoeBilly - 好吧,你可以做更多 bit 而不会让它变得太乱。但他们说,简单就是简单。
      • 肯定普及了。我的意思是你可以用一个属性(好或坏)做很多事情,但它首先是一个访问器。
      • 来自 java,似乎 c# 属性的行为类似于 mutator 和 accessor 方法。这是一个正确的假设吗?如果是这样,当属性这样做时,是否有在 C# 中使用方法来获取实例变量的意义?如果我错了,请纠正我!
      • @Ben 你是对的。 get / set are 方法。幕后,其实就是get_Ageget_EmployeeAge
      【解决方案5】:

      属性保存对象数据

      函数定义对象行为

      看看->Property Usage Guidelines

      【讨论】:

        【解决方案6】:

        哪个更好,为什么?当我们有什么是最好的编程实践 像上面那样的条件?

        我用 C# 编写,但我更喜欢使用 Get/Set 函数,对我来说,这是更好的方式来表达我可以从对象获得什么以及如何更改它的状态(并且这些方法在 Intelisense 中按字母分组,即也不错)。但是,如果团队更喜欢其他约定,这不是问题,但是当我处理自己的项目时,阅读 API 会更容易。

        e.g
        
        Obejct1 o = new Object1();
        o.P1;
        o.P2;
        o.P3;
        

        从查看 API 来看,您无法说出您在公共 API 中所做的更改或只读属性的更改,除非您使用的 IDE 会显示一个小图标,显示您实际上可以做什么。

        Object1 o = new Object1();
        o.GetP1();
        o.SetP2();
        o.SetP3();
        

        可以从 API 中轻松找到类型的客户端如何更改数据。

        【讨论】:

          【解决方案7】:

          属性是一种以简单方式探索类的内部数据元素的方法。我们可以使用类型安全的 get 和 set 方法来实现属性。使用调用约定隐式调用属性。属性适用于编译和运行时。

          Method 是包含一系列语句的代码块。Method 被显式调用。 方法在运行时起作用。

          【讨论】:

            【解决方案8】:

            我参加这个聚会有点晚了,但我只想提一下属性和无参数“get”方法之间的另一个令人惊讶的区别。正如@MarcGravell 所说,延迟加载是使用属性时的常见模式,但请注意Heisenberg Watch Window 陷阱!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-08-20
              • 2012-10-03
              • 2011-06-22
              • 2012-08-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多