结构变量不变

时间:2018-02-04 23:22:51

标签: c# unity3d struct

我觉得我错过了一些完全显而易见的东西,所以我事先道歉(如果?)就是这种情况。 我尝试做一些非常简单的事情,将结构中的bool值从false更改为true。显然我无法直接更改它,所以我在结构中创建了一个我可以调用的方法,它应该改变那里的值。似乎并非如此。这是代码,我很欣赏任何见解;

public struct ScanLineNode
    {
        [...]
        public bool rowComplete;
        [...]

        public ScanLineNode([...])
        {
            [...]
            rowComplete = false;
            [...]
        }

        public void RowCompleted()
        {
            rowComplete = true;
        }
    }

ScanLineNode Struct - 大多数东西都是隐藏的(我不相信会对此产生影响),但我已经包含了RowComplete()函数。

function isPalindrome(word){
    if(typeof word === 'undefined' || word === null){
        console.log("argument is undefined");
        return;
    }

    if(typeof word === 'string'){

       word = word.replace(/\s/gi,"");

     if(word.length < 1){
        console.log("wrong argument");
        return;
      }

      if(word.length === 1){
        console.log("It's palindrome!");
        return;
      }

      for(var i=0;i<Math.floor(word.length/2);i++){

        if(word[i] !== word[word.length - 1 - i]){
          console.log("It's not palindrome");
          return;
        }
      }
      console.log("It's palindrome");

    }else{

       console.log("argument must be a string");

    }

}

我还确认RowCOmpleted()不会在上述位置的任何地方被调用,并且&#39; rowComplete&#39;仅从RowComplete()函数调用

1 个答案:

答案 0 :(得分:7)

(来自评论)allScanLineNodes is a Dictionary<int, List<ScanLineNode>>

右; List<ScanLineNode>的索引器返回结构的副本。所以当你调用方法时 - 你在堆栈上的一个断开连接的值上调用它,片刻之后会蒸发掉(在堆栈上被覆盖 - 这不是垃圾收集器)。

这是可变结构的常见错误。你最好的选择可能是:不要制作可变的结构。但是......你可以把它复制出来,改变它,然后把变异的值推回去:

var list = allScanLineNodes[node.rowNumber];
var val = list[i];
val.RowCompleted();
list[i] = val; // push value back in

但不可变通常更可靠。

注意:可以使用数组来解决这个问题,因为数组中的索引器提供了对引用的访问权限。放置结构 - 而不是值的副本。但是:这不是一个建议,因为依赖这种微妙的差异会导致混乱和错误。