|
■No91685 (TanuTanu さん) に返信 > 配列を使用して下記みたいな事をしたいのですが上手く出来ません。
Using に配列を渡すことは出来ません。 Using を使わず、自分で Finally 句で Dispose しては如何でしょうか?
> Using parser(0) As New TextFieldParser("C:\work\test1.csv",Encoding.GetEncoding("Shift_JIS")) > Using parser(1) As New TextFieldParser("C:\work\test2.csv",Encoding.GetEncoding("Shift_JIS")) > Using parser(2) As New TextFieldParser("C:\work\test3.csv",Encoding.GetEncoding("Shift_JIS"))
カンマで区切って、複数の変数を宣言することはできます。 要素数は固定になってしまいますが、Using は入れ子にならず、単一のブロックになります。
Dim sjis = Encoding.GetEncoding("Shift_JIS") Using p1 As New TextFieldParser("C:\work\test1.csv", sjis), _ p2 As New TextFieldParser("C:\work\test2.csv", sjis), _ p3 As New TextFieldParser("C:\work\test3.csv", sjis)
Dim parser As TextFieldParser() = {p1, p2, p3} ' : ' 略 ' : End Using
もし、各パーサーを同時に使う必要が無いのなら、このように書くことができます。
Dim sjis = Encoding.GetEncoding("Shift_JIS") For n = 1 To 3 Dim csvPath As String = $"C:\work\test{n}.csv" Using parser As New TextFieldParser(csvPath, sjis) ' : ' 略 ' : End Using Next
各パーサーを同時に扱う必要があるのなら、Using を使えないので、 自分で Finally 句で Dispose することになるでしょう。
Dim sjis = Encoding.GetEncoding("Shift_JIS") Dim parsers As New List(Of TextFieldParser)() Try For n = 1 To 3 Dim csvPath As String = $"C:\work\test{n}.csv" parsers.Add(New TextFieldParser(csvPath, sjis)) Next ' : ' 略 ' : Finally parsers.ForEach(Sub(o) o.Dispose()) parsers.Clear() End Try
どうしても Using にまとめたければ、そのためのヘルパーを作るとか…?
Dim parsers As New List(Of TextFieldParser)() From {〜} Using New Example(parsers) ' 'Debug.WriteLine(parsers(0).EndOfData) 'Debug.WriteLine(parsers(1).EndOfData) 'Debug.WriteLine(parsers(2).EndOfData) ' End Using
Friend Class Example Implements IDisposable Private items As IEnumerable(Of IDisposable) Public Sub New(ByVal obj As IEnumerable(Of IDisposable)) items = If(obj, New IDisposable(-1) {}) End Sub Protected Overridable Sub Dispose(disposing As Boolean) If items IsNot Nothing AndAlso items.Any() Then If disposing Then For Each obj In items.Reverse() obj.Dispose() Next End If items = Nothing End If End Sub Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) End Sub End Class
|