在C#中,我的Windows窗体上有一个System.IO.Ports.SerialPort
组件。我的代码中有几个地方,我循环这样:
foreach (SerialPort in components.Components)
{
// Do something.
}
但是当我运行components.Components
时,每个SerialPort都会从mySerialPort.Close()
类中删除,因此所有后续循环都会错过它。这是一个错误吗?或者这是故意的吗?为什么它会像设计那样表现?
内部文档说Close()
方法只处理Stream
对象。
答案 0 :(得分:1)
这是设计的。与所有其他.NET框架类一样,SerialPort.Close()方法调用其Dispose()方法。继承自其基类Component。其中使用了处理模式,调用虚拟Dispose(bool)方法。哪个SerialPort会覆盖以关闭其流。并调用base.Dispose(bool)方法,Component使用该方法从集合中删除组件。
这是自然行为,可以将一个SerialPort放在表单上,以便在表单关闭时自动处理。在创建窗口时打开一个端口并保持打开直到它关闭也是完全正常的。在程序执行过程中关闭端口只会造成麻烦。但是否则支持,你只需要自己跟踪对象。