所以我有:
ConcurrentDictionary<string, int> dict;
我想传递对其元素之一的引用,假设dict["x"]
是一个方法,并允许该方法更改/设置该元素。是否可以做到这一点,还是我必须通过字典本身?此外,即使该元素不作为字典中的键存在,是否也可以这样做?还是它必须是字典中包含的有效键?
所以我有:
ConcurrentDictionary<string, int> dict;
我想传递对其元素之一的引用,假设dict["x"]
是一个方法,并允许该方法更改/设置该元素。是否可以做到这一点,还是我必须通过字典本身?此外,即使该元素不作为字典中的键存在,是否也可以这样做?还是它必须是字典中包含的有效键?
是的,通过使用委托。可以从更改函数中调用此委托。然后,委托将更改或设置字典中的键/值。
void DoChangeMyElement<T>(Action<T> changeIt)
{
changeIt(123);
}
您可以使用以下方法调用此方法:
ConcurrentDictionary<string, int> dict = new ...;
DoChangeMyElement(value => dict["X"] = value);
我想传递对其一个元素的引用,假设 dict["x"] 给一个方法,并允许该方法更改/设置该元素。是否可以做到这一点,或者我必须通过字典本身?
只需通过字典,正如 Sam 所说,无论如何它是一个引用类型。
此外,即使该元素不作为字典中的键存在,是否可以这样做?
不,那是不可能的,你必须添加它,然后将它发送到函数。
通过整体没有坏处Dictionary
。毕竟它本身就是一个引用类型,传递Dictionary
会比通过引用传递更好的形式。
但我想你可以封装你 int 并像这样传递它
public class IntContainer
{
int value;
}
您必须传递整个字典和密钥,然后让该方法执行所需的操作。这样做的基本原因是您只能通过引用传递字段和局部变量,而不是属性(包括索引器属性)。
如果您真的很想这样做,您可以使用反射和/或委托来完成您想要完成的事情,但这不是最好的方法。