2015-02-10 81 views
-1

我想如何分配会话变量,它是我定义的类的类型,这里是OrderData类。 我在'Session [“MyOrder”]上遇到错误;'如何将Session对象分配给C#中的本地对象.Net

我的代码片段如下所示。 也作为ord将对对象的引用,对对象的任何更改都会反映到会话对象?

OrderData ord = new OrderData(); 
if (Session["MyOrder"] == null) 
{ 
    Session.Add("MyOrder", ord); 
} 
else 
{ 
    ord = Session["MyOrder"]; 
} 
+1

*对象的任何更改都会反映到会话对象?*是的,它会反映出来。两者都指向相同的参考。 – 2015-02-10 19:21:14

回答

2

你必须明确地将它转换为你的类型,如:

ord = Session["MyOrder"] as OrderData; 

,然后检查null。如果投射失败,as可能会返回null

if(ord != null) 
{ 
    //valid value 
} 

您还可以使用:

ord = (OrderData) Session["MyOrder"]; 

但是,这可能会引发的情况下,异常的Session持有不同的类型OrderData

为:

也为ORD将是对该对象的引用,任何对 对象的更改会被反映到会话对象?

由于`对象是一个类的实例,引用类型,它们将指向同一个实例。

考虑下面的例子:

OrderData ord1 = new OrderData() {ID = 2}; 
Session["MyOrder"] = ord1; 

var ord2 = Session["MyOrder"] as OrderData; 
ord2.ID = 1; 

在代码执行结束既ord1ord2将具有ID1,因为两者的引用指向同一个对象。

+0

如果你担心抛出异常,那么为什么不做以下安全检查 'if(!string.IsNullOrEmpty(Session [“MyOrder”] as string))? – MethodMan 2015-02-10 19:25:38

+2

@MethodMan,'MyOrder'不是一个字符串,不需要将其转换为字符串,然后使用String.IsNullOrEmpty来检查。使用'as'将它转换为*特定类型*,然后检查'null'就足够了。 – Habib 2015-02-10 19:27:39

+0

如果您在他的问题中查看“OP”第二行代码,我已经评论过它的内容,它是在您的答案的多个更新之前提到的。“OP”正在检查的是会话为空然后将对象添加到会话中 – MethodMan 2015-02-10 19:30:12