使用变量作为值而不是参考

时间:2010-02-23 12:58:57

标签: c# asp.net variables ref

我在使用会话变量方面遇到了一些麻烦,因为它们被用作参考,我想将它们用作

我得到了这个解决方案,我创造了类似的东西:

DataTable dt = 
     (DataTable)HttpContext.Current.Session[
                      "SearchReturn-DataTableSchema"];

// Adding Rows of Data to DataTable dt

HttpContext.Current.Session["SearchReturn-DataTable"] = dt;

((DataTable)HttpContext.Current.Session[
     "SearchReturn-DataTableSchema"]).Rows.Clear();

return dt;

我的想法是在“ DataTableSchema ”中仅包含具有列模式的DataTable,在“ DataTable ”中包含列+行。

  

问题当我清除 DataTableSchema 中的所有行时,变量dt也会清除行数(!!)

怎么能避免这个?如何将变量(在本例中为Session变量)指定为值而不是作为引用?

谢谢。


  

答案

这个

DataTable dt = (DataTable)Session["SearchReturn-DataTableSchema"];

需要这样:

DataTable dt = ((DataTable)Session["SearchReturn-DataTableSchema"]).Copy();

: - )

4 个答案:

答案 0 :(得分:3)

你必须复制你的桌子。

答案 1 :(得分:2)

这个有趣的部分是行为取决于你的会话状态提供者。您可能目前正在使用进程内提供程序,它会保留引用 - 但大多数提供程序(可以理解)使用序列化。

当他们试图扩大规模时,这往往会让人们感到害怕,因为他们发现他们在会话中有一些不可序列化的东西。所以你可能会考虑将状态推送到另一个提供者; SQL-Server,memcached等 - 它们都将进行序列化,因此数据将是独立的。

答案 2 :(得分:0)

答案 3 :(得分:0)

另外 您可以使用克隆方法克隆DataTable架构。 然后通过Load和CreateReader方法加载数据。