【问题标题】:Variable declaration, does it create a reference to the actual object or a copy?变量声明,它是创建对实际对象的引用还是副本?
【发布时间】:2015-06-15 06:22:08
【问题描述】:

我正在查看 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 只是对会话中属性的引用,所以如果您更新本地变量,那么您也将更新会话对象?

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

【问题讨论】:

  • 这取决于CustomItemType。如果它是一个类,那么它是一个引用类型,并且确实不需要保存回来。如果它是一个结构,它是一个值类型,你会得到一个副本。
  • 最好检查一下。 session 可以做一些奇怪的事情,并且可以有不同的后备商店

标签: c#


【解决方案1】:
  1. 原始数据类型和结构(声明为struct)是'by value',classes(声明为class)是'by reference'。所以 取决于CustomItemType 是什么。
  2. 是的,它会造成潜在的线程同步问题。在一个简单的情况下,您可以将对象操作放在 lock 块中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多