C# 通过ParameteredThreadStart按值(非引用)传递参数
我试图通过以下方式将参数(复制而非引用)传递给线程:C# 通过ParameteredThreadStart按值(非引用)传递参数,c#,multithreading,visual-studio,C#,Multithreading,Visual Studio,我试图通过以下方式将参数(复制而非引用)传递给线程: Thread thread = new Thread(new ParameterizedThreadStart(DoMethod)); thread.start(concurrentQueueObj); 但我注意到它是通过引用传递的。同样的答案是“BlueM” 知道如何通过复制将参数传递给线程吗?我非常感谢你的帮助 编辑:我只希望该线程接收参数的副本。这样,如果主线程更改concurrentQueueObj,它对工作线程的参数没有影响。我理
Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
thread.start(concurrentQueueObj);
但我注意到它是通过引用传递的。同样的答案是“BlueM” 知道如何通过复制将参数传递给线程吗?我非常感谢你的帮助
编辑:我只希望该线程接收参数的副本。这样,如果主线程更改concurrentQueueObj,它对工作线程的参数没有影响。我理解您的问题,尽管您使用了错误的词 您不是通过引用传递
concurrentQueueObj
变量,而是传递作为引用的concurrentQueueObj
变量的值
简而言之,您传递的是引用,而不是引用
如果你想阅读更多关于这个主题的文章,我相信你可以在互联网上找到很多文章,也可以在Stack Overflow上找到高质量的问题和答案。你可以从阅读Jon Skeets的文章开始
通过引用传递将使用ref
或out
关键字,在C#的更高版本中,使用in
关键字
然而,据我所知,问题是:
我是否可以将concurrentQueueObj
对象的副本传递给线程,以便在它或我(启动线程的代码)修改该对象之后,该对象不会泄漏到不同的线程中
一般来说,答案是否定和肯定
C#编程语言或.NET运行时和库平台中没有一般性的东西可以解决这个问题
然而,你能做的就是自己复制一份,然后把它传给别人。具体如何做完全取决于传入的对象的类型。例如,如果它是一个列表
,您只需对其调用.ToList()
,就可以得到一个新列表
但是,您不会获得列表中所有对象的副本。这些仍将在原始列表和副本之间共享
唯一100%万无一失的“复制方法”是创建对象的深度副本,这意味着您克隆/复制其中包含的每个对象
有许多数据结构,都内置在.NET中,并作为NuGet包提供,它们旨在以不同的方式解决部分问题,例如不可变的数据结构和集合,等等。以下哪项适用于您的场景取决于该变量的类型
如果您想了解更多有关传递引用与按引用传递引用的信息,在.NET和C#中,此问题有两个轴:
- 值类型(值)
- 引用类型(引用虽然是引用变量的值,但却是引用)
- 参照传递
- 按值传递
- 按值传递值类型 哪个是副本
- 通过引用传递值类型 它是一个引用指针,指向保存该值的变量 类型
- 通过值传递引用类型 它是引用的副本,但不是它引用的对象
- 通过引用传递引用类型 这是对保存引用类型的变量的引用
- 尽管你用错了词,但我理解你的意思
您不是通过引用传递
concurrentQueueObj
变量,而是传递作为引用的concurrentQueueObj
变量的值
简而言之,您传递的是引用,而不是引用
如果你想阅读更多关于这个主题的文章,我相信你可以在互联网上找到很多文章,也可以在Stack Overflow上找到高质量的问题和答案。你可以从阅读Jon Skeets的文章开始
通过引用传递将使用ref
或out
关键字,在C#的更高版本中,使用in
关键字
然而,据我所知,问题是:
我是否可以将concurrentQueueObj
对象的副本传递给线程,以便在它或我(启动线程的代码)修改该对象之后,该对象不会泄漏到不同的线程中
一般来说,答案是否定和肯定
C#编程语言或.NET运行时和库平台中没有一般性的东西可以解决这个问题
然而,你能做的就是自己复制一份,然后把它传给别人。具体如何做完全取决于传入的对象的类型。例如,如果它是一个列表
,您只需对其调用.ToList()
,就可以得到一个新列表
但是,您不会获得列表中所有对象的副本。这些仍将在原始列表和副本之间共享
唯一100%万无一失的“复制方法”是创建对象的深度副本,这意味着您克隆/复制其中包含的每个对象
有许多数据结构,都内置在.NET中,并作为NuGet包提供,它们旨在以不同的方式解决部分问题,例如不可变的数据结构和集合,等等。以下哪项适用于您的场景取决于该变量的类型
如果您想了解更多有关传递引用与按引用传递引用的信息,在.NET和C#中,此问题有两个轴:
- 值类型(值)
- 引用类型(引用虽然是引用变量的值,但却是引用)
- 参照传递
- 按值传递
thread.start(concurrentQueueObj); concurrentQueueObj = null;
thread.start(concurrentQueueObj); concurrentQueueObj.Enqueue(someData);