2015-09-27 132 views
0

我正在创建一个纵横字谜游戏,并且似乎在网格系统中有一个简单的坐标变量分配问题。 我有一个非常简单的结构来保存离散坐标值,如下所示。我已经剥离了封装以便于阅读。C#为什么链接列表类变量在赋值后不保留其值?

public struct vec2 
    { 
     public int x, y; 
     public vec2(int x, int y) 
     { 
      this.x = x; 
      this.y = y; 
     } 
    } 

这VEC 2结构保持一个类的内部持有字值

public struct WordClass 
{ 
    string svalue; 
    bool flag; 
    public vec2 position; 

    public WordClass(string sarg, bool barg) 
    { 
     this.svalue = sarg; 
     this.flag = barg; 
     position = new vec2(0,0); 
    } 
    public string StringVal 
    { 
     get { return svalue; } 
    } 
    public bool FlagVal 
    { 
     get { return flag; } 
    } 
    public void DisableWord() 
    { 
     if (this.flipflop == false) 
     { 
      this.flipflop = true; 
     } 
    } 
    public void SetPos(int xa, int ya) 
    { 
     this.position.x = xa; 
     this.position.y = ya; 
    } 
} 

这应该基本保持永久的单词列表与使用的标志,和可变位置系统会自动计算最佳这个词的位置。

我有话

List<WordClass> WordList = new List<WordClass>(); 

,并改变一个词的坐标在单词表的动态链表

//Arbitrary values 
    WordList[0].SetPos(Position_X, Position_Y); 

现在我的问题是,当我尝试使用的位置这个词,不管我把它设置得太早,它的默认值都是0,0。在做其他功能时,我一直在挠头脑,并且留下了我想知道我是否缺少重要的东西。任何帮助将是伟大的,谢谢。

+0

检出[“何时使用结构?”](http://stackoverflow.com/q/521298/382780)。你的结构是可变的,在你试图设置一个值的时候会导致这样的问题,但它不会“粘住”,因为你实际上正在改变结构副本上的值。我认为你不应该在这里使用结构。 – 31eee384

+0

欢呼的链接,我仍然是一个业余程序员,我认为类和Structs完全可以在C#中互换。这似乎主要解决了我的问题。 –

回答

0

问题似乎与vec2ValueObject并且您正在尝试更改它有关。有问题的线路具体是这两个:

this.position.x = xa; 
this.position.y = ya; 

为什么?由于vec2是一个struct每次你读它时,你会得到一个临时副本,然后修改该副本,然后副本被扔掉,而你仍然在阅读原始的,未修改的。这就是尽可能多的价值对象应该是不可变的原因之一,除非你有很强的理由。

的第一步应该是作出正确不变vec2结构:

public struct vec2 
{ 
    public int x { get; private set; } 
    public int y { get; private set; } 

    public vec2(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
} 

一旦你得到了这一点,你需要照顾的修饰在SetPos方法。由于结构是不变的,你可以不再读它,而是每次需要改变它的时候,你会扔当前实例路程,创建一个新:

public void SetPos(int xa, int ya) 
{ 
    this.position = new vec2(xa, ya); 
} 

这将创建一个全新的结构和将其分配到包含新值的内部领域。由于这并没有真正尝试修改结构,而是改变了新结构的结构,所以它不会受到相同的细微错误的影响。

+1

_''''''''每次读取结构时都会得到一个临时copy_你确定它发生在_that具体case_中吗?请注意,我们有'List ','WordClass'也是'struct'。 – AlexD

+0

为此干杯,配合我在@ 31eee384提出的问题上的评论,完全解决了我的问题。这与临时副本和结构有关。 –

+0

@AlexD这只会加剧问题,所以临时复制问题可能会发生*两次*。我没有仔细检查,但仍然存在可变结构的问题。也就是说,当我有一个编译器时,我会测试:D – Alejandro