变量声明,它是创建对实际对象的引用还是副本
本文关键字:对象 引用 副本 声明 创建 变量 | 更新日期: 2023-09-27 17:56:27
我正在查看Web应用程序的源代码,我可以看到大量用例,例如下面的示例代码。我在网上找不到有关在 C# 中声明局部变量(复杂类型)时的任何信息,只想确定它是否创建了该对象的引用或副本。来自JavaScript背景,我想它总是创建一个引用,除非它是原始数据类型。
代码是这样的
CustomItemType myVarA = (CustomItemType) this.Session["VAR_1"];
// Do some work on the properties of VAR_1
int num2 = checked (myVarA.Items.Count - 1);
int index = 0;
while (index <= num2)
{
myVarA.Items[index].StatusCode = "Posted";
checked { ++index; }
}
// Save back to the session
this.Session["VAR_1"] = (object) myVarA;
我认为不需要以下行是否正确。
// Save back to the session
this.Session["VAR_1"] = (object) myVarA;
由于局部变量 myVarA
只是对会话中属性的引用,因此如果您更新本地变量,那么您还将更新会话对象?
其次,当每个网页都在一个新线程中提供服务时,这是否会造成问题,这些多个线程将访问相同的会话对象并同时进行操作?
- 基元数据类型和结构(声明为
struct
)是值",clasess(声明为class
)是"通过引用"。所以它取决于CustomItemType
是什么。 - 是的,它会带来潜在的线程同步问题。在一个简单的例子中,你可以把对象操作放在
lock
块里。