2016-12-06 55 views
1

比方说,我用特定的键将对象放到会话变量中。后来我把另一个对象用同一个键。我最终会得到什么?使用现有密钥向Session添加新对象是否替换旧对象?

Session["keyA"] = objectA; 

另一个请求以后

Session["keyA"] = objectB; 

对象A对象B均为List<T>。结果是一个对象C,其中包含来自objectAobjectB的行。

我的理解是,当你把一个新的对象与现有的,新的对象替换旧的。

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

为什么会发生这种情况?

+0

define *替换*:替换参考(指针),替换内存本身(如复制),...?在你的例子中'objectC'在哪里,你究竟如何访问它? –

回答

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"); 
} 

also here

这应该写在控制台 “有对象B在 '科亚'”。

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

+0

有趣? Loool!我只是想挽救自己到数据库的行程。非常感谢你的解释。 – Richard77

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; 

也许我已经在其他地方的另一个缺陷是造成这种行为, 但到目前为止,这是我正在经历。

我确定在你的代码中还有其他的错误。

+0

感谢您的解释。 – Richard77

相关问题