Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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
asp.net应用程序变量是否通过引用或值传递?_Asp.net_Variables - Fatal编程技术网

asp.net应用程序变量是否通过引用或值传递?

asp.net应用程序变量是否通过引用或值传递?,asp.net,variables,Asp.net,Variables,我最近发现,在ASP.net应用程序中使用会话或应用程序对象时,它通过引用传递值 这在大多数情况下都很有效,但现在我真正需要的是数据的一个副本,而不是对它的引用,因为我将在处理完成后放弃对它的任何更改 我还知道在应用程序的根中设置变量,有效地创建性能更好的全局应用程序变量,并消除会话/应用程序对象的所有强制转换疯狂 有人知道应用程序变量是通过引用还是通过值传递的吗?我似乎无法挖掘有关该主题的任何数据,并且希望消除当前必须将数据从应用程序对象“复制”到新变量中以进行处理的代码。实际上,默认情况下(

我最近发现,在ASP.net应用程序中使用会话或应用程序对象时,它通过引用传递值

这在大多数情况下都很有效,但现在我真正需要的是数据的一个副本,而不是对它的引用,因为我将在处理完成后放弃对它的任何更改

我还知道在应用程序的根中设置变量,有效地创建性能更好的全局应用程序变量,并消除会话/应用程序对象的所有强制转换疯狂


有人知道应用程序变量是通过引用还是通过值传递的吗?我似乎无法挖掘有关该主题的任何数据,并且希望消除当前必须将数据从应用程序对象“复制”到新变量中以进行处理的代码。

实际上,默认情况下(假设您使用的是引用类型而不是值类型)会传递引用的副本


因此,您有一个不同的变量,但它指向同一个对象。

这本身不是ASP.NET现象。。。它是所有.NET framework中CLI的固有特性。你应该看看乔恩·斯基特的经典作品

假设您正在处理引用类型,如果要克隆对象而不是简单地将引用复制到对象,则需要手动克隆它。这解释了如何深度复制对象,以及为什么
MemberwiseClone
方法只创建对象的浅层副本。

一个“应用程序”变量只是一个常规成员变量。它的工作原理与任何其他变量一样,只是它的范围比大多数变量都大

是否复制变量的值取决于变量是否为值类型

如果是值类型,例如
int
,则始终复制该值

如果是引用类型,例如
列表
,则会获得对象引用的副本。对象本身不会被复制


因此,如果需要复制的是引用类型,则必须显式创建副本。

哦,我不知道!谢谢你的澄清。有没有办法克隆对象,这样我可以在完成更改后放弃更改?没有,您可能需要保留手动复制代码。Net包含一个可以实现的IClonable接口,但它做得不是很好。还有.MemberWiseClone()方法,但这也不能实现真正的深度复制。啊,这是有意义的,因为在这个特定的例子中,我使用的是列表,而在过去我使用的是数据表。