【问题标题】:What are these two types of methods termed?这两种方法叫什么?
【发布时间】:2011-12-29 09:39:37
【问题描述】:

有些方法会对对象的属性进行操作(想不出例子),但有些方法实际上不会影响对象的属性而只是返回一个值(例如DateTime.Add())。

我知道这是一个简单的问题,但我不知道如何引用这两种方法。

【问题讨论】:

  • 我真的认为这里有一些示例代码是合适的。

标签: c# oop methods


【解决方案1】:

想不出第一个,但第二个可能被称为无副作用,如it doesn't mutate state。与其说是您如何引用它,不如说是对其行为的描述。

您往往会听到并发语言中使用的“副作用”,Axum 已经融入了这个概念。

例如,此方法无副作用:

public string GetName()
{
    return "Adam";
}

而这种方法不是:

public int GetTotal(int optionalValue = 0)
{
    _total += optionalValue;
    return _total;
}

作为方法调用的一部分,它可能会改变状态(在本例中为 _total)。下次您调用它时,_total 可能与上次相同,也可能不同,这是方法调用本身的结果。

除非您正在考虑属性设置器...

public string Name 
{
    set { _name = value; }
}

...我认为没有任何通用术语来描述方法。对象中的大多数方法都会以某种方式使用内部状态 - 读取或写入。

【讨论】:

    【解决方案2】:

    你可以简单地说

    • 实例方法
    • 静态方法

    【讨论】:

    • +1 这很可能是被问到的,如果只有来自 OP 的一些示例代码 :-)
    【解决方案3】:

    属性访问方法派生属性方法是我过去用来区分的。

    例如,属性访问方法可以很好地对未存储为 DateTime 的虚构属性执行以下操作。

    DateTime GetOrderDateTime()
    {
        return OrderDate.ConvertToDateTime();
    }
    

    派生的属性方法是:

    DateTime GetNextOrderDate()
    {
        return GetOrderDate.AddOneMonth(...);
    }
    

    我故意避免讨论什么应该是属性和什么应该是方法,因为我理解这是在 OP 发布的上下文中明确定义的。

    正如 Adam 所说,修改这些方法中的属性是引入副作用的好方法 - 最好坚持使用好名称(例如 ModifyTotal)和 Get 方法和属性获取的约定(通常)不应该修改属性。

    【讨论】:

    • 自从我加入这个论坛以来,我已经看到了你的一些帖子,你总是以易于理解的方式解释事情,直截了当,谢谢伙计。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2012-07-25
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多