变量声明,它是创建对实际对象的引用还是副本

本文关键字:对象 引用 副本 声明 创建 变量 | 更新日期: 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 只是对会话中属性的引用,因此如果您更新本地变量,那么您还将更新会话对象?

其次,当每个网页都在一个新线程中提供服务时,这是否会造成问题,这些多个线程将访问相同的会话对象并同时进行操作?

变量声明,它是创建对实际对象的引用还是副本

  1. 基元数据类型和结构(声明为 struct )是值",clasess(声明为class)是"通过引用"。所以它取决于CustomItemType是什么。
  2. 是的,它会带来潜在的线程同步问题。在一个简单的例子中,你可以把对象操作放在lock块里。