|
■No88790 (B.B さん) に返信 > using (var player = new SoundPlayer(soundFile)) player.Play();
PlaySync メソッドではなく、 Play メソッドを使っている場合の話ですね。
> この場合はDisposeしなくともすぐ破棄されるのでしょうか?
そもそも SoundPlayer クラスは、Dispose をオーバーライドしていません。継承しているだけ。
実験用に、こんな感じのクラスを用意しておき、
class WavePlayer : System.Media.SoundPlayer { internal WavePlayer(string soundLocation) : base(soundLocation) { } internal WavePlayer(System.IO.Stream stream) : base(stream) { } protected override void Dispose(bool disposing) { System.Diagnostics.Debug.WriteLine($"SoundPlayer.Dispose({disposing})"); base.Dispose(disposing); } }
class WaveStream : System.IO.FileStream { internal WaveStream(string file) : base(file, System.IO.FileMode.Open, System.IO.FileAccess.Read) { } protected override void Dispose(bool disposing) { System.Diagnostics.Debug.WriteLine($"Stream.Dispose({disposing})"); base.Dispose(disposing); } }
呼び出し側をこんな感じに変更してみると、動作の違いが見えてくるかも。
private string soundFile = @"C:\windows\media\Alarm01.wav";
private void button1_Click(object sender, EventArgs e) => new WavePlayer(new WaveStream(soundFile)).Play();
private void button2_Click(object sender, EventArgs e) { using (var player = new WavePlayer(new WaveStream(soundFile))) player.Play(); }
private void button3_Click(object sender, EventArgs e) { using (var wave = new WaveStream(soundFile)) using (var player = new WavePlayer(wave)) { player.Play(); } }
|