变量声明,是否创建对实际对象或副本的引用?

时间:2015-06-15 06:22:09

标签: c#

我正在查看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只是对会话中属性的引用,因此如果更新本地var,那么您还将更新会话对象吗?

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

1 个答案:

答案 0 :(得分:2)

  1. 原始数据类型和结构(声明为struct)是'by value',clasess(声明为class)是'通过引用'。所以 取决于CustomItemType是什么。
  2. 是的,它会造成潜在的线程同步问题。在一个简单的例子中,您可以将对象操作放在lock块中。