Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将变量用作值而不是引用_C#_Asp.net_Variables_Ref - Fatal编程技术网

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();