使用现有密钥向Session添加新对象是否会替换旧对象?

时间:2016-12-06 17:58:53

标签: c# asp.net

假设我使用某个键将对象放入会话变量。后来我把另一个对象放在同一个键上。我最后会得到什么?

Session["keyA"] = objectA;

稍后的另一个请求

Session["keyA"] = objectB;

objectA objectB 都是List<T>。结果是 objectC ,其中包含来自 objectA objectB 的行。

我的理解是,当您使用现有对象放置新对象时,新对象将替换旧对象。

也许我在其他地方有另一个导致此行为的错误,但到目前为止,这正是我所遇到的。

为什么会这样?

2 个答案:

答案 0 :(得分:2)

如果使用赋值运算符导致类似的行为,则代码中的某个地方会发生其他事情。没有理由将Session["keyA"]设置为objectB会导致它与objectA合并。

对于此答案,

SessionDictionary<string, object>。尝试运行此代码:

var d = new Dictionary<string, object>();
var objectA = new List<string> { "a", "b", "c" };
var objectB = new List<string> { "d", "e", "f" };
d["keyA"] = objectA;
d["keyA"] = objectB;
if (d["keyA"] == objectB) {
    Console.WriteLine("has objectB at 'keyA'");
} else {
    Console.WriteLine("has something else, I don't know");
}

also here

这应该写&#34;对象B在&#39; keyA&#39;&#34;在控制台中。

如果它没有出现可怕的错误,你应该立即从计算机上拔下插头,取出所有电池,并以安全的方式处理整件事。

答案 1 :(得分:1)

  

我的理解是当你把一个新物体放在现有的时候,   新对象替换旧对象。

不,它不会取代旧的。如您所知,当您将对象存储到变量中,然后将其分配给另一个变量时,它们都是相同的,因为它只是引用地址内存中的对象。

var obj1 = new Object();
var obj2 = obj1;

// this line just set value of obj2 into null and obj1 is still works
obj2 = null;

在你的场景中,与我上面代码所说的没什么不同:

Session["keyA"] = objectA;

// this won't replace `objectA` with objectB
// only store the reference of objectB in the dictionary with keyA
Session["keyA"] = objectB;
  

也许我在其他地方有另一个导致此行为的错误,   但到目前为止,这正是我所经历的。

我确定代码中的其他地方还有另一个错误。