【问题标题】:Integer gets automatically set to 0 C#整数自动设置为 0 C#
【发布时间】:2016-09-19 14:52:41
【问题描述】:

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

所以这是我的名为 car 的类,它包含一个构造函数。
private int speed 有一个 get 和 set 访问器。
有 2 种方法称为加速和中断。

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);

    }
}

当我运行程序时,即使初始化为 5,控制台也只显示 0。为什么会发生这种情况,我做错了什么?

【问题讨论】:

  • 它确实为我编译
  • Speed 不是 speed(标识符区分大小写)
  • 您应该关注.NET capitalization conventions。所以类应该是pascal-case,这意味着它们以大写字母开头,而局部变量应该以小写字母开头。否则很难阅读您的代码。
  • set { speed = Speed; } 应该是set { speed = value; }
  • 或者,或者public int Speed { get; set; },完全去掉speed字段。

标签: c# console int


【解决方案1】:

您的Speed 属性是问题所在。代码如下:

public int Speed //access private int speed
{
    get { return speed; }
    set { speed = Speed; }
}

getter 很好——它返回私有变量的值。

然而,setter 将 variable 的值设置为评估 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;
}

【讨论】:

    【解决方案2】:

    更改此代码:

    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 关键字为基础字段设置值。

    【讨论】:

      【解决方案3】:

      您的set 评估员应该是

      set { speed = value; } 
      

      所以你的属性定义变成了

      public int Speed //access private int speed
      {
          get { return speed; }
          set { speed = value; }
      }
      

      【讨论】:

        【解决方案4】:

        问题出在集合里,改这个

            set { speed = Speed; }
        

        为此

            set { speed = value; }
        

        祝你好运!

        【讨论】:

          【解决方案5】:

          @Jay 是正确的,但在这种情况下首选语法是

          public int Speed { get; set;}
          

          并删除

          private int speed;
          

          让编译器为您处理成员详细信息,因为您没有在 get/set 属性中运行任何实际逻辑

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-10-12
            • 2014-12-01
            • 1970-01-01
            • 2012-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-13
            相关资源
            最近更新 更多