C# 使用`<;列表>;`在处理C中的指针时#

C# 使用`<;列表>;`在处理C中的指针时#,c#,list,pointers,C#,List,Pointers,如果一个项目本质上是一个指针,我如何向列表中添加该项目,并避免将列表中的每个项目更改为该项目的最新实例 我的意思是: 我正在做图像处理,有可能我需要处理比我处理速度更快的图像(在短时间内)。在这些图像“爆发”之后,我将依赖于这样一个事实,即我可以以比平均图像速率更快的速度处理图像,并且最终将“赶上” 所以,我想做的是在获取图像时将图像放入一个,然后如果我的处理线程不忙,我可以从该列表中获取图像并将其移交 我的问题是,我担心由于我将图像“Image1”添加到列表中,然后用新图像填充“Image1”

如果一个项目本质上是一个指针,我如何向列表中添加该项目,并避免将列表中的每个项目更改为该项目的最新实例

我的意思是:
我正在做图像处理,有可能我需要处理比我处理速度更快的图像(在短时间内)。在这些图像“爆发”之后,我将依赖于这样一个事实,即我可以以比平均图像速率更快的速度处理图像,并且最终将“赶上”

所以,我想做的是在获取图像时将图像放入一个
,然后如果我的处理线程不忙,我可以从该列表中获取图像并将其移交

我的问题是,我担心由于我将图像“Image1”添加到列表中,然后用新图像填充“Image1”(在下一次图像采集期间),因此我也将用新图像替换列表中存储的图像(因为图像变量实际上只是一个指针)

因此,我的代码看起来有点像这样:
while(!exitcondition)
{
if(imageAvailable())
{
Image1=AcquireImage();
ImgList.Add(图1);
}
如果(ImgList.Count>0)
{
ProcessEngine.NewImage(ImgList[0]);
ImgList.RemoveAt(0);
}
}

鉴于上述情况,我如何确保:
-每次修改Image1时,我不会替换列表中的所有项目。
-我不需要预先声明大量图像即可进行此类处理。
-我不会创造一个吞噬记忆的怪物。


非常感谢您的建议。

您的代码是正确的。以上代码都不会影响以前添加的图像。该行:

Image1 = AcquireImage();
将从AcquireImage返回的(对图像的)引用放入Image1引用变量。然后:

ImgList.Add(Image1);
将该引用添加到列表中。更改Image1引用变量不会影响列表中已有的引用。

只需重新初始化:

替换

Image1 = AcquireImage();

或者说

ImageList.Add(new Image(AcquireImage()));

从概念上讲,您的代码将很好。重要的是AcquireImage()为每个传入的映像分配一个新实例


如果Image1是一个指针,您会遇到问题-但是C#reference不是指针。

如果我正确理解您的意思,您希望能够在不覆盖现有数据的情况下重新使用变量。好消息是你不需要改变任何事情。当你说
Image1
是一个指针时,你说的部分正确:它是指向它当时指向的任何一个图像的引用。分配时:

Image1 = AcquireImage();

您不会覆盖现有图像的内容,而是更改引用以使其指向新图像。假设
AcquireImage
工作正常,并且每次都返回一个新的图像,而不是覆盖上一个图像,则上述代码将放弃现有的引用而使用新的引用。但是,由于您已经将其添加到列表中,对图像的引用将保留在代码中的某个位置,因此不会丢失。

Ah,因此
list
不仅仅指向实例的位置,而是实际单独分配内存?不知何故,我永远也无法完全理解C#是如何做事的。。。谢谢你的洞察力@Gorchestopher:它修改Image1变量-但更改该变量的值不会更改列表中的任何内容。它将Image1设置为对新图像的引用。但该列表仍然保留对旧的.Jon的引用,除非Image1是可变的并且AcquireImage正在其上写入(这意味着它必须是一个字段)。但我不认为是这样的。让我困惑的是我以前在做类似的事情时遇到的一个问题:Image1=AcquireImage();Image2=Image1;Image2.Dispose()和突然之间Image1为空。啊,这样做时,ImgList中的Image1的旧实例将被保留?+1,这是正确的。处理完图像对象后,不要忘记对其调用Dispose()。只有在AcquireImage反复修改同一图像对象时才有必要这样做。为了确保这一点,您可以发布Acquire1的代码吗?它每次都会构造一个新对象吗?我只是想补充一点——使用队列而不是列表不是更好吗?它更适合于生产者和消费者的这种情况,因为您总是弹出最先到达的映像,并且排队和退队都是O(1)操作。@Tesserex正在队列上阅读这看起来是一个很好的选择!你有什么理由不使用队列吗?啊,泰塞雷斯赢了我@Matthew我不能发布Acquire1的代码,因为它是商业DLL中的一个函数,我没有源代码。我不同意。同样的概念也适用于指针列表。我的评论有点草率。我试图预测OP在将引用称为指针时可能意味着什么,结果得到了一个双指针(或者一个理论上装箱的可变指针)。
ImageList.Add(new Image(AcquireImage()));
Image1 = AcquireImage();