整数自动设置为0 C#

时间:2016-09-19 14:52:42

标签: c# console int

我正在制作一个小型控制台程序,该程序显示汽车的移动速度以及使其速度更快或更慢的功能。

所以这是我的类叫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初始化也是如此。为什么会发生这种情况,我做错了什么?

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属性中运行任何实际逻辑