我觉得我错过了一些完全显而易见的东西,所以我事先道歉(如果?)就是这种情况。 我尝试做一些非常简单的事情,将结构中的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()函数调用
答案 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
但不可变通常更可靠。
注意:可以使用数组来解决这个问题,因为数组中的索引器提供了对引用的访问权限。放置结构 - 而不是值的副本。但是:这不是一个建议,因为依赖这种微妙的差异会导致混乱和错误。