【发布时间】:2015-08-14 20:34:51
【问题描述】:
我正在阅读 Head First C# 书籍,但我无法弄清楚他们为什么使用以下方式来创建属性。它似乎与我在其他地方以及书中看到的惯例不一致。
我了解创建属性的模式是:
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
基于上述模式,我会这样编写代码:
private decimal cost;
public decimal Cost
{
get
{
cost = CalculateCostOfDecorations() + (CalculateCostOfBeveragesPerPerson() + CostOfFoodPerPerson) * NumberOfPeople;
if (HealthyOption)
{
cost *= .95M;
}
return cost;
}
}
在书中它是这样呈现的:
public decimal Cost
{
get
{
decimal totalCost = CalculateCostOfDecorations();
totalCost += (CalculateCostOfBeveragesPerPerson() + CostOfFoodPerPerson)*NumberOfPeople;
if (HealthyOption)
{
totalCost *= .95M;
}
return totalCost;
}
}
这两个代码在程序中都能正常工作。创建此类属性的最佳实践是什么?属性中的 decimal totalCost 是 private 吗?如果是这样,为什么在创建属性之前没有声明它?
另外,创建两行代码有什么意义:
decimal totalCost = CalculateCostOfDecorations();
totalCost += (CalculateCostOfBeveragesPerPerson() + CostOfFoodPerPerson)*NumberOfPeople;
当你可以通过写作完成完全相同的事情时:
cost = CalculateCostOfDecorations() + (CalculateCostOfBeveragesPerPerson() + CostOfFoodPerPerson) * NumberOfPeople;
【问题讨论】:
-
没有理由将
cost存储为支持字段,因为每次调用 getter 时都会重新计算它。totalCost是一个局部变量,它不存在于getter 的作用域之外,它临时保存计算结果直到返回值。两次使用具有相同变量名的decimal是语法错误,并且会在您尝试编译时出现错误。 -
感谢您的回答。另外,两次使用的“小数”是一个错字,谢谢指出。
标签: c# properties convention