我正在查看 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
只是对 session 中属性的引用,所以如果您更新局部变量,那么您也会更新 session 对象吗?
其次,当每个网页都在一个新线程中提供时,这些多个线程将访问同一个 session 对象并同时进行操作,这会不会造成问题?
最佳答案
- 原始数据类型和结构(声明为
struct
)是'by value', classess(声明为class
)是'by reference'。所以 取决于CustomItemType
是什么。 - 是的,它会带来潜在的线程同步问题。在一个简单的情况下,您可以将对象操作放在
lock
block 中。
关于c# - 变量声明,它是创建对实际对象的引用还是副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30838504/