我正在制作一个小型控制台程序,该程序显示汽车的移动速度以及使其速度更快或更慢的功能。
所以这是我的类叫car,它包含一个构造函数 private int speed 有一个get和set访问器 有两种方法称为加速和中断。
class car
{
private int speed;
public car (int initialSpeed) //initializes car speed
{
Speed = initialSpeed;
}
public void accelerate() //increase Speed
{
Speed = Speed + 10;
}
public void brake() //decrease Speed
{
Speed = Speed - 10;
}
public int Speed //access private int speed
{
get { return speed; }
set { speed = Speed; }
}
}
现在问题在于:
class program
{
static void Main(string[] args)
{
var Car = new car(5);
Console.WriteLine(Car.Speed);
}
}
当我运行程序时,控制台只显示0,即使用5初始化也是如此。为什么会发生这种情况,我做错了什么?
答案 0 :(得分:9)
您的Speed
财产是问题所在。这是代码:
public int Speed //access private int speed
{
get { return speed; }
set { speed = Speed; }
}
getter很好 - 它返回私有变量的值。
然而,setter将变量的值设置为评估getter的结果 - 忽略完全传递给setter的值(可通过value
变量获得)。它应该是:
public int Speed
{
get { return speed; }
set { speed = value; }
}
或者更好的是,使用automatically implemented property - 移除speed
字段,然后只有:
public int Speed { get; set; }
与此同时,我建议学习复合赋值运算符和.NET命名约定。如果你正在使用C#6,你也可以使用表达式身体成员,只留下少量代码:
class Car
{
public int Speed { get; set; }
public Car(int initialSpeed)
{
Speed = initialSpeed;
}
public void Accelerate() => Speed += 10;
public void Brake() => Speed -= 10;
}
答案 1 :(得分:5)
更改此代码:
public int Speed //access private int speed
{
get { return speed; }
set { speed = Speed; }
}
到
public int Speed //access private int speed
{
get { return speed; }
set { speed = value; }
}
在C#属性中,setter使用value
关键字为基础字段设置值。
答案 2 :(得分:1)
您的set
评估员应该
set { speed = value; }
所以您的属性定义变为
public int Speed //access private int speed
{
get { return speed; }
set { speed = value; }
}
答案 3 :(得分:1)
问题在于设置,更改此
set { speed = Speed; }
这个
set { speed = value; }
祝你好运!
答案 4 :(得分:0)
@Jay是正确的,但在这种情况下首选的语法是
public int Speed { get; set;}
并删除
private int speed;
让编译器为您处理成员详细信息,因为您没有在get / set属性中运行任何实际逻辑