C#setter将值更改为0

时间:2015-11-11 12:26:40

标签: c#

我在使用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类中位置的setter。

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

我的问题是该值似乎在setter中变为零。

输出:

Roll吗? (Y / N)Y

玩家1滚动:4

位置为:0 //在播放器位置设置器中打印

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

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

4 个答案:

答案 0 :(得分:5)

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

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

详细了解MSDN上的value关键字。

答案 1 :(得分:2)

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

而不是

 _position = position;

你应该使用

_position = value;

答案 2 :(得分:2)

问题是您使用的是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;

答案 3 :(得分:1)

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

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

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