C# 将变量用作值而不是引用
我在使用会话变量时遇到了一些问题,因为它们被用作引用,我想将它们用作值 我开始调试我的解决方案,并创建了如下内容:C# 将变量用作值而不是引用,c#,asp.net,variables,ref,C#,Asp.net,Variables,Ref,我在使用会话变量时遇到了一些问题,因为它们被用作引用,我想将它们用作值 我开始调试我的解决方案,并创建了如下内容: DataTable dt = (DataTable)HttpContext.Current.Session[ "SearchReturn-DataTableSchema"]; // Adding Rows of Data to DataTable dt HttpContext.Current.Session["Search
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也将清除这些行(!!)
如何避免这种情况?如何将变量(在本例中为会话变量)指定为值而不是引用
多谢各位
答复 这个 需要这样做:
DataTable dt = ((DataTable)Session["SearchReturn-DataTableSchema"]).Copy();
:-)您必须复制表。使用DataTable的.copy()方法:
其中一个有趣的部分是,行为将取决于会话状态提供程序。目前您可能正在使用进程内提供程序,它保留引用,但大多数提供程序(可以理解)使用序列化 当人们试图扩大规模时,这通常会让他们感到痛苦,因为他们发现会话中有一些不可序列化的内容。因此,您可以考虑将状态推到不同的提供者中;SQL Server、memcached等—它们都将进行序列化,因此数据将是独立的。同样 可以使用Clone方法克隆DataTable架构。
然后通过Load和CreateReader方法加载数据。完全忘记了DataTable.Copy():)了解.NET处理内容和方式的好处:)顺便问一句:你“总是”在线吗?你不睡觉吗?工作?;-)如果你仔细观察我的用法,你会发现工作时间的间隔非常清晰(午餐除外)。。。让我们说我们对此“有话要说”-但是睡眠被高估了。。。
DataTable dt = ((DataTable)Session["SearchReturn-DataTableSchema"]).Copy();