Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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# 如何防止变量在设置后更新?_C#_List - Fatal编程技术网

C# 如何防止变量在设置后更新?

C# 如何防止变量在设置后更新?,c#,list,C#,List,我有一个交换列表中两个项目的方法。问题是在我更改itemA的值后,“temp”变量会更新。如何防止“temp”在初始化后更新 void SwapItems(Item itemA, Item itemB) { Item temp = itemA; itemA.OriginItemPosition = itemB.OriginItemPosition; itemA.OriginItemRectangle = itemB.OriginItemRectangle; i

我有一个交换列表中两个项目的方法。问题是在我更改itemA的值后,“temp”变量会更新。如何防止“temp”在初始化后更新

void SwapItems(Item itemA, Item itemB)
{
    Item temp = itemA;

    itemA.OriginItemPosition = itemB.OriginItemPosition;
    itemA.OriginItemRectangle = itemB.OriginItemRectangle;

    itemB.OriginItemPosition = temp.OriginItemPosition;
    itemB.OriginItemRectangle = temp.OriginItemRectangle;
}

这是因为temp1保存itemA的引用,而不是复制的值。 要在您的情况下交换项目,我将执行以下操作:

void SwapItems(Item itemA, Item itemB)
{
    var temp1 = itemA.OriginItemPosition;
    var temp2 = itemA.OriginItemRectangle;

    itemA.OriginItemPosition = itemB.OriginItemPosition;
    itemA.OriginItemRectangle = itemB.OriginItemRectangle;

    itemB.OriginItemPosition = temp1;
    itemB.OriginItemRectangle = temp2;
}
你也可以有这样的东西,有些人可能会觉得更好:

// Swaps the references themselves for reference-types.
void Swap<T>(ref T a, ref T b)
{
    var tmp = a;
    a = b;
    b = tmp;
}

// Swaps the properties between two Item objects.
void SwapItems(Item a, Item b)
{
    Swap(ref a.OriginalItemPosition, ref b.OriginalItemPosition);
    Swap(ref a.OriginalItemRectangle, ref b.OriginalItemRectangle);
}
//将引用本身交换为引用类型。
无效掉期(参考T a、参考T b)
{
var tmp=a;
a=b;
b=tmp;
}
//在两个项目对象之间交换属性。
无效SwapItems(项目a、项目b)
{
交换(参考a.原始位置,参考b.原始位置);
交换(参考a.OriginalItemRectangle,参考b.OriginalItemRectangle);
}

如果您试图交换
列表中的两个项目,请不要通过交换项目上属性的值来进行交换(除非您有充分的理由)。通过交换列表中的项目来完成。这样,如果向项目添加更多属性,则不必修改交换方法来复制所有属性

static void Swap<T>(IList<T> list, int indexA, int indexB)
{
    int tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
} 
静态无效交换(IList列表、int indexA、int indexB)
{
int tmp=列表[indexA];
列表[indexA]=列表[indexB];
列表[indexB]=tmp;
} 
您也可以在项目上实施

Item temp = itemA.Clone();

@Adam有理由假设这只是对
temp
@Adam:no swapping的原始分配的替换,但在更新itemA时防止temp更改,这是线程的要点,不是吗?这假设了
ICloneable
的正确实现,在我看来,这相当于根本不需要使用
ICloneable
接口。不管怎样,我已经修改了我之前的评论,我不是反对者。所以在讨论了不要不必要地创建对象之后,你提出了一个会引发拳击的解决方案?至少要使其通用。+1做得很好,虽然这些都不是简单交换列表项所需要的,但如果对这些对象的其他引用也需要以静默方式“交换”,这可能会有用。@adamhuldsworth True。如果他想交换列表中的项目,他可以使用
swap(列表[a],列表[b])
或其他方法。然而,他似乎在为引用类型和临时值交换的想法而挣扎,这种通用的交换方法是行不通的。您交换的是参数引用,而不是引用的值。它们必须是
ref
parameters.@JeffMercado你说得对,我不知道我怎么会错过这个。谢谢,修好了!