Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
清除包含ComObject的列表时,是否在c#中释放所有对象?_C#_List_Comobject - Fatal编程技术网

清除包含ComObject的列表时,是否在c#中释放所有对象?

清除包含ComObject的列表时,是否在c#中释放所有对象?,c#,list,comobject,C#,List,Comobject,我有一个包含不同com对象的列表。如果我做了myList.Clear()就足够了,还是我应该循环遍历它并执行此操作 for (int i = 0; i < myList.Count; ++i) if (System.Runtime.InteropServices.Marshal.IsComObject(myList[i])) System.Runtime.InteropServices.Marshal.ReleaseComObject(myList[i]);

我有一个包含不同
com对象的列表。如果我做了
myList.Clear()
就足够了,还是我应该循环遍历它并执行此操作

for (int i = 0; i < myList.Count; ++i)
     if (System.Runtime.InteropServices.Marshal.IsComObject(myList[i]))
         System.Runtime.InteropServices.Marshal.ReleaseComObject(myList[i]);

     myList.Clear();
for(int i=0;i
它没有坏,所以不要修理它。如果COM对象的收集语义没有问题,请让垃圾收集器完成其工作。如果您遇到问题,请仔细描述问题以及您对C#中COM互操作的理解

特别是,调用
ReleaseComObject
来管理RCW或更糟的情况,
Release
是一个仅适用于互操作专家的锐利工具。不正确地使用这些工具可能会使您陷入许多充满崩溃和内存损坏的可怕情况。(如果您曾经看到“COM对象与其RCW分离”异常,您知道有人认为他们知道自己在做什么,称之为
ReleaseComObject
错误。)

如果您不了解RCW是什么、它的用途或它与基础COM对象的区别,请停止编写互操作代码,直到您理解它为止。记忆安全系统是为您的安全和方便而设计的;除非你能描述这样做的所有后果,否则不要搞砸它

我注意到你的实际问题从未得到回答:

清除包含ComObject的列表时,是否在c#中释放所有对象


当然不是。为什么要这样做?它将清除列表。当程序逻辑要求清除列表时,请清除列表。不要清除列表,因为您认为这样做会对其他代码产生连锁反应

它没有坏,所以不要修理它。如果COM对象的收集语义没有问题,请让垃圾收集器完成其工作。如果您遇到问题,请仔细描述问题以及您对C#中COM互操作的理解

特别是,调用
ReleaseComObject
来管理RCW或更糟的情况,
Release
是一个仅适用于互操作专家的锐利工具。不正确地使用这些工具可能会使您陷入许多充满崩溃和内存损坏的可怕情况。(如果您曾经看到“COM对象与其RCW分离”异常,您知道有人认为他们知道自己在做什么,称之为
ReleaseComObject
错误。)

如果您不了解RCW是什么、它的用途或它与基础COM对象的区别,请停止编写互操作代码,直到您理解它为止。记忆安全系统是为您的安全和方便而设计的;除非你能描述这样做的所有后果,否则不要搞砸它

我注意到你的实际问题从未得到回答:

清除包含ComObject的列表时,是否在c#中释放所有对象


当然不是。为什么要这样做?它将清除列表。当程序逻辑要求清除列表时,请清除列表。不要清除列表,因为您认为这样做会对其他代码产生连锁反应

为什么您觉得有必要操纵可调用包装器的引用计数?或者,更好的问题是:您认为ReleaseComObject做了什么?很有可能你对此有错误的想法。@EricLippert所以在这种情况下,只要打电话澄清就可以释放他们了?@LionKing:你为什么在意?让垃圾收集器完成它的工作。有什么原因让你觉得你应该为它做GC的工作吗?你为什么还要清理名单?你还没有说出你认为RCO()做了什么;你能解释一下你的想法吗?如果您不理解RCO的功能,那么应该停止编写COM互操作代码,直到您理解它为止。如果你用错了,你会真的,真的把事情搞砸。@EricLippert这就是我现在做的。我正在将
Microsoft.Office.Interop.Outlook.Folder
添加到
myList
。然后我对它们执行一些逻辑,最后我不确定该如何处理它们(这就是我的问题所在)。我应该在下次清除它们还是循环并释放它们(我以后会多次填写列表)。@EricLippert总结一下,我不应该对它做任何事情,让垃圾收集器做它该做的事情。你能把你的评论作为一个答案,这样我就可以接受它吗?为什么你觉得有必要操纵可调用包装器的引用计数?或者,更好的问题是:您认为ReleaseComObject做了什么?很有可能你对此有错误的想法。@EricLippert所以在这种情况下,只要打电话澄清就可以释放他们了?@LionKing:你为什么在意?让垃圾收集器完成它的工作。有什么原因让你觉得你应该为它做GC的工作吗?你为什么还要清理名单?你还没有说出你认为RCO()做了什么;你能解释一下你的想法吗?如果您不理解RCO的功能,那么应该停止编写COM互操作代码,直到您理解它为止。如果你用错了,你会真的,真的把事情搞砸。@EricLippert这就是我现在做的。我正在将
Microsoft.Office.Interop.Outlook.Folder
添加到
myList
。然后我对它们执行一些逻辑,最后我不确定该如何处理它们(这就是我的问题所在)。我应该在下次清除它们还是循环并释放它们(我以后会多次填写列表)。@EricLippert总结一下,我不应该对它做任何事情,让垃圾收集器做它该做的事情。你能把你的评论作为回答,这样我就可以接受了吗?