设置后如何保持变量不被更新?

时间:2012-07-05 14:22:40

标签: c# list

我有一个方法来交换列表中的2个项目。问题是在更改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;
}

3 个答案:

答案 0 :(得分:2)

这是因为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);
}

答案 1 :(得分:0)

如果您尝试在List中交换两个项目,请不要通过交换项目上的属性值来执行此操作(除非您有充分的理由)。通过交换列表中的项目来完成。这种方式如果您例如为您的商品添加更多属性,您无需修改​​交换方法即可将其全部复制。

static void Swap<T>(IList<T> list, int indexA, int indexB)
{
    int tmp = list[indexA];
    list[indexA] = list[indexB];
    list[indexB] = tmp;
} 

答案 2 :(得分:0)

你也可以在项目上实现ICLoneable

Item temp = itemA.Clone();