C#只读计算属性,它们应该是方法吗?

时间:2010-01-08 20:49:53

标签: c# standards

我有几个实体,它们有计算字段,如TotalCost。现在我把它们作为属性,但我想知道它们是否应该是方法。这有C#标准吗?

public class WorkOrder
{
    public int LaborHours { get; set; }
    public decimal LaborRate { get; set; }

    // Should this be LaborCost()?
    public decimal LaborCost
    {
        get
        {
            return LaborHours * LaborRate;
        }
    }
}

11 个答案:

答案 0 :(得分:54)

只要计算时间不明显,就可以使用计算出的属性而不是方法

请参阅Property usage guidelines

答案 1 :(得分:15)

我认为方法应该对对象执行操作,通常会更改对象的状态。即使计算属性,属性也应反映对象的当前状态。所以你应该保留你的房产IMO。

答案 2 :(得分:7)

我认为他们都应该是属性。只要它不改变对象的状态,我就把它作为一个属性来冷静。

此外,如果我使用您的类进行数据绑定(WPF等),那么我可以直接绑定到您的属性,而无需修改/扩展该类。

答案 3 :(得分:3)

如果它们是a)轻量级且b)没有副作用,我会将它们作为属性。

轻量级当然有点模糊,但经验法则是:如果我不得不担心调用一个属性(无论是在循环中还是在其他任何地方),它应该是一种方法。

答案 4 :(得分:1)

我会将它们留作属性。但是,没有“标准”的理由以这种或那种方式做事。如果你是独自一人,做你最喜欢的事。如果您是团队成员,那么请遵循团队其他成员所遵循的惯例。

答案 5 :(得分:0)

在我看来,这是一种偏好;这就是你想要做的。在大多数情况下,我做的都是做法,除非涉及到逻辑。另外,如果您需要传入参数来更改功能,那么显然会应用一种方法...

答案 6 :(得分:0)

取决于,如果你的“属性”变成猛犸象并且需要一大堆业务逻辑它们不应该是属性,那么应该有一种方法。 您发布的示例看起来可以成为一个属性。没有标准的做法,坚持你的直觉;如果它看起来需要做很多事情,你可能需要一种方法。

答案 7 :(得分:0)

如果某个属性的计算成本特别高,我可能会将其更改为GetWhatever()方法。这可以作为任何使用我的类的人的暗示,这个值需要一些重要的工作才能到达,并且调用者应该缓存值而不是多次调用该方法。

琐碎的计算在属性中非常合适。

答案 8 :(得分:0)

无论如何,它主要只是语法糖,所以,只要它只是返回有关对象的信息而不是更改对象或与其他对象交互,那么您希望自己是团队中的惯例,或者您喜欢什么。

答案 9 :(得分:0)

MSDN提供有关此here

的信息
  

类库设计者经常必须这样做   决定实施一个班级   会员作为财产或方法。在   一般来说,方法代表行动和   属性代表数据。

你认为它是哪一个?动作计算/ getLaborCost还是数据?

WorkOrder workOrder = new WorkOrder();
workOrder.LaborHours = 8;
workOrder.LaborRate = 20;

decimal cost = workOrder.LaborCost; // This is OK here

但是如果你打算对同一个对象也这样做:

worOrder.LaborHours = 18;
decimal newCost = workOrder.LaborCost 

现在这不是一个属性。成为一种方法会好得多。

答案 10 :(得分:0)

有时,您还必须考虑您正在建模的内容......在某些域中,计算出的值通常或预期是模型的属性 - 属性。如果是这种情况,那么将其写为属性,即使计算计算起来并不是微不足道或有点贵。只需在API上记录它或实现一些缓存机制,以最大限度地减少对此属性的重新计算。