API Basic Using ja - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Using / End Using

ClassicUO • Basic

Using はブロックを離れるときにネイティブリソースを閉じます。既存の変数、またはリソースを返す式を受け取る形式をサポートします。

正確な構文

Dim resource = MemoryStream()
Using resource
    statements
End Using
Using resourceExpression
    statements
End Using

パラメーター

  • resourceExpression — 開始時に一度だけ評価します。File(path)、MemoryStream()、CreateTimer(...) が対象です。タイマーの解放は永久停止です。Basic.Timers を参照してください。String、数値、List、Dictionary は本体の実行前にソース行付きエラーになります。変数は先に宣言してください。ヘッダー内の宣言、As New、カンマ区切りの資源、ユーザー定義 Dispose は未対応です。
  • statements / End Using — End Using は取得済みのオブジェクトを閉じます。変数は残りますがリソースは閉じています。複数のリソースはブロックを入れ子にします。変数を再代入しても閉じる元のオブジェクトは変わりません。

戻り値

文自体に戻り値はありません。本体の Return はリソースを解放してから手続きを離れます。例の IsClosed は 1/True または 0/False を返す自作関数です。Main の結果は文字列であり、成功フラグではありません。

動作

  • File(path) はラッパーを作成します。ブロック内で書き込みは Create()、読み込みは Open() を呼びます。Dispose は Close() によりバッファーとハンドルを解放します。MemoryStream を閉じると Length() はエラーになります。例はメモリだけを使い、ファイルを作りません。
  • コンパイラーは保護領域を作り、インタープリターは現在の呼び出しでオブジェクトを保持します。End Using、Return、Exit、Continue、外へのジャンプは内側から外側の順で閉じます。本体へのジャンプは実行前に拒否されます。
  • 通常のエラーでは外側の Catch 前に解放します。失敗した Dispose は再試行せず、外側の資源も閉じます。緊急停止はスクリプトの Catch/Finally を省略しますが、ネイティブ資源は解放します。終了エラーはキャンセルを置き換えません。一時停止中は再開か停止まで保持します。スレッドは追加せず、OS の停止中のクローズ処理を強制中断する機能ではありません。
  • 資源を開いたままエラーを回復するには、Using 内に Try/Catch を置きます。On Error Resume Next で本体の未処理エラーが発生すると資源を閉じ、ブロック全体の後から続行します。On Error GoTo は Using 内のラベルを指定できません。すでに閉じた保護領域へ再び入ることになるためです。
  • エラーで Using を離れた後、外側の On Error GoTo ハンドラーの Resume はブロックの先頭から再実行し、資源の式を再評価します。Resume Next は End Using の直後へ進みます。閉じたオブジェクトを指す変数では再び開きません。再試行には新しい資源を取得する式を使います。実行済みの処理が繰り返されることがあります。

使用例

1. メモリストリームを閉じる

# stream が資源、size は開いている間の Length()=0 です。終了後 IsClosed がエラーを捕捉して True=1 を返し、Main は "0:1" を返します。ByVal は参照をコピーします。この学習用関数は Length のあらゆるエラーを閉鎖とみなすため、これらのストリーム専用です。
Option Explicit On
Function IsClosed(ByVal stream) As Boolean
    Try
        Dim size = stream.Length()
        Return False
    Catch closed
        Return True
    End Try
End Function

Sub Main()
    Dim stream = MemoryStream()
    Dim size = -1
    Using stream
        size = stream.Length()
    End Using
    Return CStr(size) & ":" & CStr(IsClosed(stream))
End Sub

パラメーターと実行の説明:

stream が資源、size は開いている間の Length()=0 です。終了後 IsClosed がエラーを捕捉して True=1 を返し、Main は "0:1" を返します。ByVal は参照をコピーします。この学習用関数は Length のあらゆるエラーを閉鎖とみなすため、これらのストリーム専用です。

2. 補助関数から戻る

# ReadLength(stream) は Integer 0 を計算します。Return は Main が size を受け取る前にストリームを閉じます。次の Length は失敗し、closed=True、結果は "0:1" です。呼び出し側で開いたまま必要な資源は渡さないでください。
Option Explicit On
Function ReadLength(ByVal stream) As Integer
    Using stream
        Return stream.Length()
    End Using
End Function

Sub Main()
    Dim stream = MemoryStream()
    Dim size = ReadLength(stream)
    Dim closed = False
    Try
        Dim after = stream.Length()
    Catch problem
        closed = True
    End Try
    Return CStr(size) & ":" & CStr(closed)
End Sub

パラメーターと実行の説明:

ReadLength(stream) は Integer 0 を計算します。Return は Main が size を受け取る前にストリームを閉じます。次の Length は失敗し、closed=True、結果は "0:1" です。呼び出し側で開いたまま必要な資源は渡さないでください。

3. エラー時の入れ子解放

# outer と inner は別のストリームです。Throw "demo" は inner、outer の順に閉じます。Catch は元のメッセージを保持し、IsClosed は各 1 を返します。Main は "demo:2"。2 は閉じたオブジェクトの数で、Boolean ではありません。
Option Explicit On
Function IsClosed(ByVal stream) As Boolean
    Try
        Dim size = stream.Length()
        Return False
    Catch closed
        Return True
    End Try
End Function

Sub Main()
    Dim outer = MemoryStream()
    Dim inner = MemoryStream()
    Dim message = ""
    Try
        Using outer
            Using inner
                Throw "demo"
            End Using
        End Using
    Catch problem
        message = problem
    End Try
    Return message & ":" & CStr(IsClosed(outer) + IsClosed(inner))
End Sub

パラメーターと実行の説明:

outer と inner は別のストリームです。Throw "demo" は inner、outer の順に閉じます。Catch は元のメッセージを保持し、IsClosed は各 1 を返します。Main は "demo:2"。2 は閉じたオブジェクトの数で、Boolean ではありません。


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic