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

标签 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 只是对 session 中属性的引用,所以如果您更新局部变量,那么您也会更新 session 对象吗?

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

最佳答案

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

关于c# - 变量声明,它是创建对实际对象的引用还是副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30838504/

相关文章:

c# - ExecuteReader等待操作超时错误

c# - 如何在Xamarin的MVVMCross中实例化安装程序类?

c# - 如何使用数组值更新数据库中的列?

c# - 如何在 C# 中监视和重新启动引发异常的任务?

c# - 如何使用网络路径获取默认打印机名称

c# - 返回中间字母或回文字母的函数

c# - SQLite "automatic index on MyTable(Id)"当字段是表的主键时

c# - 使用 Entity Framework 创建数据库索引

c# - 降低 C# for 循环的性能以获得比 C for 循环更大的范围

c# - 根据文本长度调整文本框和表单大小