gpt4 book ai didi

c# - 为什么修改一个 session 变量也会修改另一个 session 变量?

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:31 25 4
gpt4 key购买 nike

我有一个奇怪的问题。我的变量之一是通过此函数更改的(下面的代码)。我不知道这怎么可能。我想改变 Session["p_skok"],但在某种程度上,变量 Session["z_skok"] 也在改变。

    protected void oblicz_parametry()
{
List<string> lista_odnosnik_wartosc = (List<string>)Session["p_wartosc"];
List<Type> lista_odnosnik_typ = (List<Type>)Session["p_typ"];
List<bool> lista_odnosnik_inkrementacja = (List<bool>)Session["p_inkrementacja"];
List<int> lista_odnosnik_nr = (List<int>)Session["p_nr"];
List<int> lista_odnosnik_skok = (List<int>)Session["p_skok"];

List<int> lista_odnosnik_skok_pomocnicza = (List<int>)Session["z_skok"];
if (Session["iteracja"] != null)
{
for (int i = 0; i < lista_odnosnik_inkrementacja.Count(); i++)
{
if (lista_odnosnik_skok[i] == 0 && lista_odnosnik_inkrementacja[i] == true)
{
int zwieksz = lista_odnosnik_nr[i];
//if (lista_odnosnik_typ[i].ToString() == "int")
//{
int zm_pomocnicza = Convert.ToInt32(lista_odnosnik_wartosc[i]) + lista_odnosnik_nr[i];
lista_odnosnik_wartosc[i] = zm_pomocnicza.ToString();
//}
lista_odnosnik_skok[i] = lista_odnosnik_skok_pomocnicza[i] + 1;
}
lista_odnosnik_skok[i]--;
}
Session["p_wartosc"] = lista_odnosnik_wartosc;
Session["p_skok"] = lista_odnosnik_skok;

}
else
{
Session["iteracja"] = 1;
Session["p_wartosc"] = Session["z_wartosc"];
Session["p_inkrementacja"] = Session["z_inkrementacja"];
Session["p_nr"] = Session["z_nr"];
Session["p_skok"] = Session["z_skok"];

oblicz_parametry();

}
}

我做了一些调试,发现减少是由于 lista_odnosnik_skok[i]--; 部分代码造成的。你知道会发生什么吗?

最佳答案

这是两件事的结合。在 else 子句中你有这个:

Session["p_skok"] = Session["z_skok"];

完成后,这两个变量将引用同一个列表。现在无论你对一个列表做什么,你都会对另一个列表做,因为它们是同一个列表。

然后你设置Session["iteracja"] = 1;,这意味着下一次条件if (Session["iteracja"] != null)将是真实的。

在该条件下,您正在对 lista_odnosnik_skok 进行更改,即 Session["p_skok"]Session["z_skok"相同的列表];


要解决它,请不要将一个 session 变量设置为等于另一个。你可以这样做:

var existingList = (List<int>)Session["z_skok"];
Session["p_skok"] = new List<int>(existingList);

现在您已经创建了一个新列表,其中包含与原始列表相同的元素。它们是两个不同的列表,因此修改一个不会修改另一个。

值得注意的是,这是有效的,因为 int 是一种值类型,而不是引用类型,所以当您将一个列表中的值添加到另一个列表时,您正在创建新值。您可以修改一个列表中的值而不修改其他列表。

如果列表中的项目是引用类型,您仍然会遇到类似的问题。您有两个列表(好),但它们都包含对相同对象的引用(可能不好)。您可以在一个列表上添加或删除而不修改另一个列表,但修改列表中的项目会修改另一个列表中的项目,因为它们都是相同的项目。

不过,这只是为了解释。该列表包含 int,因此在这种情况下这不是问题。


如果您在开始时从 Session 中读取您需要的所有内容到变量中,然后在最后将所有内容保存回 Session 中,则可能更容易理解。这样你就不会试图同时跟踪局部变量和 session 变量。这很困惑,这意味着更容易犯错误。

您甚至可能会发现定义一个包含所有这些列表的新类很有帮助。从 session 中检索一个对象(如果它为空,则创建一个新对象),并在您使用完它后,保存整个对象。这与您正在做的一样,但现在您只处理一个 session 变量而不是五个,并且更容易跟踪。

关于c# - 为什么修改一个 session 变量也会修改另一个 session 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56780250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com