假设我使用某个键将对象放入会话变量。后来我把另一个对象放在同一个键上。我最后会得到什么?
Session["keyA"] = objectA;
稍后的另一个请求
Session["keyA"] = objectB;
objectA 和 objectB 都是List<T>
。结果是 objectC ,其中包含来自 objectA 和 objectB 的行。
我的理解是,当您使用现有对象放置新对象时,新对象将替换旧对象。
也许我在其他地方有另一个导致此行为的错误,但到目前为止,这正是我所遇到的。
为什么会这样?
答案 0 :(得分:2)
如果使用赋值运算符导致类似的行为,则代码中的某个地方会发生其他事情。没有理由将Session["keyA"]
设置为objectB
会导致它与objectA
合并。
Session
是Dictionary<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");
}
这应该写&#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;
也许我在其他地方有另一个导致此行为的错误, 但到目前为止,这正是我所经历的。
我确定代码中的其他地方还有另一个错误。