如果该项目本质上是一个指针并且避免将列表中的每个项目更改为该项目的最新实例,那么如何将项目添加到列表中?
这就是我的意思:
我正在进行图像处理,并且我有可能需要处理比我能处理的图像更快的图像(在很短的时间内)。在这个“爆发”的图像之后,我将依赖于这样一个事实:我可以比平均图像速率更快地处理,并且最终将“赶上”。
所以,我想要做的是当我获取它们时将我的图像放入<List>
,然后如果我的处理线程不忙,我可以从该列表中取出图像并交给它。 / p>
我的问题是我担心因为我将图像“Image1”添加到列表中,然后用新图像填充“Image1”(在下一次图像采集期间)我将替换列表中存储的图像同时使用新图像(因为图像变量实际上只是一个指针)。
所以,我的代码看起来有点像这样:
while (!exitcondition)
{
if(ImageAvailabe())
{
Image1 = AcquireImage();
ImgList.Add(Image1);
}
if(ImgList.Count > 0)
{
ProcessEngine.NewImage(ImgList[0]);
ImgList.RemoveAt(0);
}
}
鉴于上述情况,我如何确保:
- 每次修改Image1时,我都不会替换列表中的所有项目
- 我不需要预先声明一些图像来进行这种处理
- 我没有创造一个吞噬怪物的记忆。
非常感谢任何建议。
答案 0 :(得分:2)
重新初始化:
替换
Image1 = AcquireImage();
与
Image1 = new Image(AcquireImage());
或者只是说
ImageList.Add(new Image(AcquireImage()));
答案 1 :(得分:1)
您的代码是正确的。上述代码均未影响以前添加的图像。这一行:
Image1 = AcquireImage();
将从AcquireImage返回的引用(到图像)放入Image1引用变量。然后:
ImgList.Add(Image1);
添加对您的列表的引用。更改Image1引用变量不会影响列表中已有的引用。
答案 2 :(得分:0)
从概念上讲,您的代码会很好。重要的元素是AcquireImage()为每个传入的图像分配一个新实例。
如果Image1是一个指针,你会遇到问题 - 但是C#引用不是指针。
答案 3 :(得分:0)
如果我理解你说的正确,你希望能够重复使用变量而不会覆盖现有数据。好消息是你不需要改变任何东西。当你说Image1
是一个指针时,你是部分正确的:它是对当时指向的任何一个图像的引用。分配时:
Image1 = AcquireImage();
您不会覆盖现有图像的内容,而是更改参考,使其指向新图像。假设AcquireImage
正常工作并且每次都返回一个新图像,而不是覆盖前一个图像,上面的代码将丢弃现有的引用以支持新的引用。但是,当您已将其添加到列表中时,对代码的引用将保留在代码中的某个位置,因此不会丢失。