我最近发现,当在ASP.net应用程序中使用Session或Application对象时,它会通过引用传递值。
这在大多数情况下都很有用,但现在我在一个我真正需要数据副本的地方,而不是对它的引用,因为我会在完成处理时放弃对它的任何更改。
我也知道在应用程序的根目录中设置变量,有效地创建具有更好性能的全局应用程序变量,并消除会话/应用程序对象的所有投射疯狂。
有人知道应用程序变量是通过引用还是值传递?我似乎无法挖掘有关该主题的任何数据,并希望消除我目前必须将Application对象中的数据“复制”到新变量中进行处理的代码。
答案 0 :(得分:4)
这本身并不是一种ASP.NET现象......它是所有.NET框架中CLI所固有的。你应该看看Jon Skeet的经典article on Parameter passing。
假设您正在处理引用类型,如果要克隆对象而不是简单地复制对象的引用,则需要手动克隆它。 Here's a good article解释了如何深度复制对象以及为什么MemberwiseClone
方法只创建对象的浅表副本。
答案 1 :(得分:3)
实际上,默认情况下会发生什么(假设您有引用类型而不是值类型)是它传递了参考的副本。
所以你有一个不同的变量,但它指向同一个对象。
答案 2 :(得分:0)
“Application”变量只是一个常规成员变量。它就像任何其他变量一样工作,只是它的范围大于大多数。
如果复制变量的值取决于变量是否为值类型。
如果它是值类型,例如int
,则始终复制该值。
如果它是引用类型,例如List<int>
,则会获得对该对象的引用的副本。对象本身不会被复制。
因此,如果您需要复制的是引用类型,则必须明确创建副本。