C# 我可以锁定类实例变量的副本吗?
在C#中,类实例是引用类型。这是否意味着可以锁定C# 我可以锁定类实例变量的副本吗?,c#,locking,C#,Locking,在C#中,类实例是引用类型。这是否意味着可以锁定new返回的值的副本?在我的例子中,我有一个类,其中包含一些需要锁定的字段: class Foo { // ... private Dictionary<IAsyncResult, string> fReadRequests; private Dictionary<IAsyncResult, string> fWriteRequests; private Dictionary<IAsyn
new
返回的值的副本?在我的例子中,我有一个类,其中包含一些需要锁定的字段:
class Foo {
// ...
private Dictionary<IAsyncResult, string> fReadRequests;
private Dictionary<IAsyncResult, string> fWriteRequests;
private Dictionary<IAsyncResult, string> fSyncRequests;
}
这安全吗?即使应用锁的变量是原始变量的副本,锁是否也能按预期工作?是的,您从未锁定保存引用的变量,而是始终锁定实例 在本例中,您复制的是引用,而不是对象,因此这些字段中的对象与您正在处理的对象相同 锁定这些应该很好 只要知道:
对象
变量中有它们。每次将值类型复制到对象
变量时,都会得到一个新的副本,该副本将有自己的锁private readonly object fLockReadQuests = new object();
然后锁定它
但同样,你在问题中的假设成立。是的,你从来没有锁定保存引用的变量,你总是锁定实例 在本例中,您复制的是引用,而不是对象,因此这些字段中的对象与您正在处理的对象相同 锁定这些应该很好 只要知道:
对象
变量中有它们。每次将值类型复制到对象
变量时,都会得到一个新的副本,该副本将有自己的锁private readonly object fLockReadQuests = new object();
然后锁定它
但同样,您在问题中的假设成立。不确定这是否是您的意思,但存储在
reqDict
中的词典不会是词典的副本,它将是对原始词典的引用,所以它的工作原理和您为每个词典复制代码的工作原理相同。简言之,是的,你的锁应该很好用@T.Kiley-所以引用(不是实例)是一个副本。不确定这是否是您的意思,但存储在reqDict
中的字典不会是字典的副本,它将是对原始字典的引用,所以它的工作原理和您为每个字典复制代码一样。简言之,是的,你的锁应该很好用@T.Kiley-所以参考(不是实例)是一个副本。谢谢。这是一个在C#比我在这里寻找的时间更长的人给我的安慰,你提供了这一点。谢谢。这是一个在C#比我在这里寻找的时间更长的人给我的安慰,而你正好提供了这一点。