【问题标题】:Using variables as value and not as reference使用变量作为值而不是参考
【发布时间】:2010-02-23 12:58:56
【问题描述】:

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

我开始调试我的解决方案并创建了类似的东西:

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

:-)

【问题讨论】:

    标签: c# asp.net variables ref


    【解决方案1】:

    您必须复制您的表格。

    【讨论】:

    • 忘记了所有关于 DataTable.Copy() :)
    【解决方案2】:

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

    当人们试图扩大规模时,这通常会咬人,因为他们发现他们在会话中有一些不可序列化的东西。因此,您可能会考虑将状态推送到不同的提供者; SQL-Server、memcached 等 - 它们都将进行序列化,因此数据将是独立的。

    【讨论】:

    • 了解 .NET 处理什么以及如何处理的好处 :) 顺便说一句:你“总是”在线吗?你不睡觉吗?工作? ;-)
    • 如果您仔细查看我的用法,您会在工作时间(午餐时间除外)中看到非常明确定义的间隙......假设我们“有关于它的话”;-p 但是睡眠被高估了......
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      还有 您可以使用 Clone 方法克隆 DataTable Schema。 然后通过 Load 和 CreateReader 方法加载数据。

      【讨论】:

        猜你喜欢
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-18
        相关资源
        最近更新 更多