1

C#ではSystem.IO.Ports.SerialPort、Windowsフォームにコンポーネントがあります。私のコードには、次のようにループする場所がいくつかあります。

foreach (SerialPort in components.Components)
{
    // Do something.
}

ただし、を実行すると、各SerialPortがcomponents.Componentsクラスから削除されるmySerialPort.Close()ため、後続のすべてのループで失われます。これはバグですか?それともこれは意図的なものですか?なぜそれは設計上そのように振る舞うのでしょうか?

内部ドキュメントには、メソッドはオブジェクトを内部Close()でのみ破棄すると記載されています。Stream

4

1 に答える 1

1

これは仕様によるものです。他のすべての.NETFrameworkクラスと同様に、SerialPort.Close()メソッドはDispose()メソッドを呼び出します。基本クラスのComponentから継承されます。これは、仮想Dispose(bool)メソッドを呼び出して、破棄パターンを使用します。ストリームを閉じるためにオーバーライドするSerialPort。そして、Componentがコレクションからコンポーネントを削除するために使用するbase.Dispose(bool)メソッドを呼び出します。

それ以外の場合、これは自然な動作です。SerialPortをフォームにドロップして、フォームが閉じたときに自動的に破棄されるようにすることができます。また、ウィンドウの作成時にポートを開き、ウィンドウが閉じるまで開いたままにしておくのもまったく正常です。プログラム実行の途中でポートを閉じると、問題が発生します。ただし、他の方法でサポートされている場合は、オブジェクトを自分で追跡する必要があります。

于 2012-06-01T17:40:15.600 に答える