Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何存储变量';s值,并且在该变量更改时不更改它?_C#_Arrays_List_Variables_Stored Procedures - Fatal编程技术网

C# 如何存储变量';s值,并且在该变量更改时不更改它?

C# 如何存储变量';s值,并且在该变量更改时不更改它?,c#,arrays,list,variables,stored-procedures,C#,Arrays,List,Variables,Stored Procedures,我正在尝试创建一个列表,其中存储了角色的当前位置以及以前的位置。在此代码开始之前,字符将移动一列/行,并在另一种方法中更新其当前位置。如果位置列表大于(移动计数器+1),则删除第一项 但是,当我运行这部分代码时,以前存储在列表中的当前位置也会发生更改 假设我们从一个列表开始:{[6,7],[7,7]}和当前位置[7,7]。(这些是我输入的默认初始值,[6,7]为随机起始位置,[7,7]为初始当前位置) 移动到位置[8,7]后,列表立即更改为{[6,7],[8,7]}。然后在运行代码时,它变成了{

我正在尝试创建一个列表,其中存储了角色的当前位置以及以前的位置。在此代码开始之前,字符将移动一列/行,并在另一种方法中更新其当前位置。如果位置列表大于(移动计数器+1),则删除第一项

但是,当我运行这部分代码时,以前存储在列表中的当前位置也会发生更改

假设我们从一个列表开始:{[6,7],[7,7]}和当前位置[7,7]。(这些是我输入的默认初始值,[6,7]为随机起始位置,[7,7]为初始当前位置)

移动到位置[8,7]后,列表立即更改为{[6,7],[8,7]}。然后在运行代码时,它变成了{[8,7],[8,7]},而它本应该是{[7,7],[8,7]},存储最后一个已知的当前位置和当前位置

list\u size=known\u cells.Count;
已知的_单元格。添加(当前_位置);
如果(列表大小>(移动计数器+1))
{
dataGridView1.行[已知单元格[0][0]]。单元格[已知单元格[0][1]]。Style.BackColor=Color.LightGray;
已知_细胞。移除(0);
}
类协作()
{
int x=0;
int y=0;
公共合作社(国际x、国际y)
{
x=x;
y=y;
}
}
班级游戏()
{
列表坐标=新列表();
公共无效添加坐标(坐标c)
{
添加(c);
如果(coords.Count>maxAmount)
{
坐标移动(0);
}
}
}

列表为{[8,7],[8,7]},因为您已将此代码之前的当前位置更新为[8,7]。 要分解它

列表变成{[6,7],[8,7]}

然后,添加已知的_单元格(当前_位置);将添加当前位置[8,7]。所以列表变成了{[6,7],[8,7],[8,7]}

现在,“if”条件将删除第一个元素[6,7]

因此,您只剩下列表{[8,7],[8,7]}

我建议您添加[8,7],而不是将[7,7]替换为[8,7],然后删除第一个元素。
希望这不是一个太混乱的解释:)

我怀疑你的
当前职位是某种参考类型。然后执行“已知单元格添加”(当前位置)
”时,您并不是在添加当前值,而是在该值上添加一个引用

稍后更改属性时,这些更改也会通过列表中的引用显示

解决方案:更改为“不可变”类。所以不是

class ThePosition
{
   public int Coord1 {get; set;}
   public int Coord2 {get; set;}

   public ThePosition() {} 
   // default constructor that will also be added by the compiler
}
确保无法更改属性:

class ThePosition
{
   public int Coord1 {get; private set;}
   public int Coord2 {get; private set;}

   public ThePosition(int c1, int c2) 
   {
      Coord1 = c1; Coord2 = c2;
   } 
   // no default constructor!
}

因此,您需要创建一个新实例来存储不同的位置:
current\u position=newtheposition(7,8)

你能再解释一下列表在做什么吗?是的,当然!该列表存储角色过去的“相关”位置,以便他所处的瓷砖为棕色。如果他足够远(移动计数器),瓷砖应该逐渐恢复到原来的浅灰色,如代码中所示!你所说的这堆看起来与OP无关的代码到底是什么意思?我将展示如何完成它。如果他能提供更多没有“空白”的代码,我会写更多与问题相关的代码。谢谢你的回答!这是真的,但是“已知_单元”不存在于代码的任何其他部分中!问题是,每当对变量current_位置进行任何更改时,列表中先前存储的所有值都会立即更改!哇,这正是我所想的,但我不知道该怎么做!我想存储当前位置变量的“绝对”值,而不是如您所述的is的引用。我来试试,谢谢!
class ThePosition
{
   public int Coord1 {get; private set;}
   public int Coord2 {get; private set;}

   public ThePosition(int c1, int c2) 
   {
      Coord1 = c1; Coord2 = c2;
   } 
   // no default constructor!
}