【问题标题】:C# setter changes value to 0C# setter 将值更改为 0
【发布时间】:2015-11-11 12:26:39
【问题描述】:

我在用 C# 编写棋盘游戏时遇到了一个 setter 问题。

这里我有一个 if 语句,我得到一个新的随机数并尝试更新我的玩家 p 的位置。

if(Console.ReadLine().Equals("Y"))
{
  int roll = dice.roll();
  Console.WriteLine(p.playerName + " rolled: " + roll);
  int newPosition = p.position + roll;
  p.position = newPosition;

  Console.WriteLine("The players position is: " + p.position);
}

这是 Player 类中位置的设置器。

public int position
    {
        get
        {
            return _position;
        }
        set
        {
            Console.WriteLine("Position is: " + position);
            _position = position;
        }
    }
    private int _position;

我的问题是设置器中的值似乎变为零。

输出:

滚动? (Y/N)Y

玩家 1 掷出:4

Position is: 0 // 在 Player 位置设置器中打印

玩家位置是:0 //从玩家对象获取值时打印出来

当我发送一个值时,为什么setter中位置0的值是4?

【问题讨论】:

  • 尝试在 setter 中使用 _position = value; 而不是 _position = position;
  • 这解决了!谢谢奥利弗。
  • 假设这是现代 C#,你可以写 public int Position { get; set; }。如果您使用 Unity,我认为这是不支持的。

标签: c#


【解决方案1】:

您的 setter 调用属性的 get,它返回当时的实际值,可能是 0。你需要使用value,这是传入的值:

set
{
    Console.WriteLine("Position is: " + value);
    _position = value;
}

MSDN 上阅读有关value 关键字的更多信息。

【讨论】:

    【解决方案2】:

    您的设置器从不设置一个值,它只是使用现有的属性值。由于该值从未设置,因此它是默认整数值 0。

    代替

     _position = position;
    

    你应该使用

    _position = value;
    

    【讨论】:

      【解决方案3】:

      问题是您使用的是属性position,而不是属性参数value。这就是你分配0的原因,它是从getter返回的初始值:

      public int position
      {
          get
          {
              return _position;
          }
          set
          {
              Console.WriteLine("Position is: " + position);
              // _position = position; // <-- NO, that's using the getter so _position
              _position = value;       // <-- Yes, this is the argument
          }
      }
      private int _position;
      

      【讨论】:

        【解决方案4】:

        您的代码有问题。在集合内,您正在访问位置。但是位置是二传手的目的。本质上,您正在获取当前位置并将其设置为新值。当你得到 0 时,我当前的位置是 0(因为它是一个 int,也可能 0 是默认值,而不是字符串的 null )。

        Setter 在变量“value”中有新值,因为它是默认存储的。因此,考虑到这一点,您的代码应该是:

            public int position
            {
                get
                {
                    return _position;
                }
                set
                {
                    Console.WriteLine("Position is: " + value);
                    _position = value;
                }
            }
            private int _position;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-16
          • 1970-01-01
          • 1970-01-01
          • 2020-03-24
          • 2015-12-05
          • 2013-10-24
          • 1970-01-01
          相关资源
          最近更新 更多