将ref传递给集合元素

时间:2013-12-09 07:52:34

标签: c# struct reference

我正在构建一个使用.dll与盒子通信的应用程序。将盒子视为黑盒子,你需要知道的是我可以使用dll函数和引用访问盒子的内存。

现在,我的应用程序需要一个字典(我考虑用数组替换,如果需要),它将包含位于盒子内存中的结构。我需要使用ref将一个结构从集合传递给框,然后该框将更新结构的数据。问题是我不能直接从集合中传递一个条目,因为它是一个动态成员。

我考虑过从集合中传递一个元素作为本地成员,它将作为ref传递,并且在框更新后,我将根据需要更新自己的结构,但我宁愿将ref传递给结构直接。< / p>

如何直接将ref传递给collectiin中的元素?

3 个答案:

答案 0 :(得分:1)

无需使用ref,只需正常传递您的Dictionary<TKey, TValue>,因为它本身就是一种参考类型,您的框所做的任何修改都会在之后的字典中反映出来!

e.g。

myBox.DoStuffWith(myDictionary);
// changes to a particular value in dictionary will be accessible, e.g.
Console.WriteLine(((StructType)myDictionary[myKey].Value).Member);

更新:

跟着你发表评论:

  

函数如下所示:UpdateMessage(ref message)

你可以这样:

Message msg = myDictionary[id];
UpdateMessage(ref msg);
myDictionary[id] = msg

UPDATE2:

你说你想避免这种情况。 Extension methods是专门设计的,当你无法控制Type(DLL上有一个Update(),我们称之为MessageUpdater),所以你可以把上面的内容包装成一个:

class MessageExtensions
{
    public static Message Update(this MessageUpdater updater, Dictionary<int,Message> dict, int key)
    {
        Message value = dict[key];
        MessageUpdater.Update(ref value);
        return dict[key];
    }
}

然后你所要做的就是:

Message updatedMessage = myMessageUpdater.Update(myDict, key);

这可以接受吗?

答案 1 :(得分:1)

我自己想过一个解决方案..我的解决方案是使用一个结构数组而不是一个字典..我已经失去了一些功能,但它是我可以忍受的东西。我可以自己编写函数,从字典中为我提供我想要的函数。

这样的事情:

MessageStruct[] messages = new MessageStruct[64];

messages[0] = new MessageStruct();

UpdateMessage(ref messages[0]);

Console.writeline(message[0]);

另一个解决方案是Lasse V. Karlsen提供的......

答案 2 :(得分:1)

我建议定义一个简单的类:

public class ExposedFieldHolder<T>
{
  public T Value;
  public ExposedFieldHolder(T val) { Value = val; }
}

然后使用Dictionary<TKey, ExposedFieldHolder<MessageStruct>>。在向字典中添加内容时,您必须创建一个包含相应值的new ExposedFieldHolder<MessageStruct>,但要修改字典中的内容,您将能够:

UpdateMessage(ref theDictionary[theKey].Value);

并在适当的位置进行更新。请注意,此技术还允许使用Interlocked.CompareExchange之类的内容以及存储在字典中包装器中的Int32等基元。