关于C#属性的循环引用

时间:2011-12-13 11:29:28

标签: c#

可能这是一个新手问题,但在这里。 我正在开发一个纸牌游戏,我有一个名为Player的类... 玩家拥有一个名为Partner(另一个玩家)的属性和另一个名为Points的属性。

public class Player
{ 
   public Player()
   {
   }
   public Player Partner { get; set; }

   private int points = 0;
   public int Points 
   { 
   get { return points;}
   set { 
       if (Partner != null) Partner.Points = value;
       points = value; 
       } // -> Here is the problem cause p1.Partner = p2 and p2.Partner = p1
   }

问题是:如何为玩家设置Points属性以及自动设置其Partner点属性,这是“最优雅的方式”?

例如:

Player p1 = new Player();
Player p2 = new Player();
p1.Partner = p2;
p2.Partner = p1;
p1.Points = 10;
int p = p2.Points

p应该等于10.

提前致谢, 马塞洛 巴西<

4 个答案:

答案 0 :(得分:4)

我想我会添加一个复合(thx @ noah)类“Team”。

团队拥有“玩家”和“积分”的属性。

public class Team
    {
        public Player[] Players { get; set; } //or Player1 and Player2, depends
        public int Points { get; set; }
    }
}

答案 1 :(得分:2)

set { 
    points = value; 
    if (Partner != null && Partner.Points != value)
    {
        Partner.Points = value;
    }
}

将修复循环引用,但拥有一个Partnership对象,他们都指的是获得总积分将更清晰,并允许每个玩家存储他们已经得分的各个点。

答案 2 :(得分:1)

Points属性移出播放器类,并将其移至GameBoardTeam类。

如果你有一个Team课程,你可能甚至不需要Partner上的Player属性,而是拥有Team属性。< / p>

答案 3 :(得分:0)

将以下内容添加到您的setter的第一行:

if (points == value && partner.Points == value) return

这应该可以阻止你的无限递归。