forloop中的数组分配缺省会话值

本文关键字:缺省 会话 分配 数组 forloop | 更新日期: 2024-09-22 04:06:44

在每个循环中,我想要数组serRefine的默认值,但它也采用了serRefine[4]的旧值

for (int i = 0; i < rptSize.Items.Count; i++)
{
     Label lblSizeCount = (Label)rptSize.Items[i].FindControl("lblSizeCount");
     HiddenField hfSizeID = (HiddenField)rptSize.Items[i].FindControl("hfSizeID");
     string[] serRefine = (string[])Session["RefineSelection"];
     if (serRefine[4].ToString() != "")
     {
         string Finalsids = "";
         string[] sids = serRefine[4].Split(',');
         for (int j = 0; j < sids.Length; j++)
         {
             if (sids[j].ToString() != hfSizeID.Value)
                 Finalsids += sids[j].ToString() + ",";
         }
         Finalsids += hfSizeID.Value;
         Finalsids = Finalsids.TrimEnd(',');
         serRefine[4] = Finalsids;
     }
     else
         serRefine[4] = hfSizeID.Value;
     lblSizeCount.Text = CommonManager.GetProductCountWithAll(serRefine);
}

forloop中的数组分配缺省会话值

现在我已经理解了这个问题。您希望数组在每次迭代时都处于初始状态。但事实并非如此,因为它是一个引用类型,并且您正在循环中修改它。下面是一个简化的样本来重现这种行为:

string[] RefineSelection = new[] {"A", "B", "C", "D", "E" };
for (int i = 1; i <= 3; i++)
{
    string[] serRefine = RefineSelection;  // you're not creating a copy but you're referencing the session-array
    string hfSizeID = "foo" + i;
    Console.WriteLine(string.Join(",", RefineSelection));
    serRefine[4] = hfSizeID;
    Console.WriteLine(string.Join(",", RefineSelection));
}

输出为:

A,B,C,D,E
A,B,C,D,foo0
A,B,C,D,foo0
A,B,C,D,foo1
A,B,C,D,foo1
A,B,C,D,foo2

因此,上次迭代中的"foo"值将在更改之前使用。如前所述,这是因为数组是一个引用类型,而变量的作用域不是循环本身,因此使用了相同的引用。

您可以从Session阵列创建一个克隆:

for (int i = 0; i < rep.Count; i++)
{
    string[] copy = (string[])RefineSelection.Clone();
    string hfSizeID = "foo" + i;
    Console.WriteLine(string.Join(",", copy));
    copy[4] = hfSizeID;
    Console.WriteLine(string.Join(",", copy));
}

输出:

A,B,C,D,E
A,B,C,D,foo0
A,B,C,D,E
A,B,C,D,foo1
A,B,C,D,E
A,B,C,D,foo2