MRが楽しい

MRやVRについて学習したことを書き残す

C#でコードブロック内の処理が行われているときにフラグを立てる

本日はC#の小ネタ枠です。
C#でコードブロック内の処理が行われているときにフラグを立てる方法についてです。

コードブロック内の処理が行われているときにフラグを立てる

コードブロック内の処理が行われているときのみフラグを立てるには以下のようにIDisposableを実装したクラスを作成します。
・ScopedFlag.cs

using System;

public class ScopedFlag : IDisposable
{
    private readonly Action<bool> _setFlag;
    private bool _disposed;

    public ScopedFlag(Action<bool> setFlag)
    {
        _setFlag = setFlag;
        _setFlag(true); // ブロック開始時にフラグON
    }

    public void Dispose()
    {
        if (!_disposed)
        {
            _setFlag(false); // ブロック終了時にフラグOFF
            _disposed = true;
        }
    }
}

動作確認のため、Unityで以下のテストスクリプトを作成しました。
・ScopedFlagTest.cs

using UnityEngine;

public class ScopedFlagTest : MonoBehaviour
{
    bool isProcessing = false;

    [ContextMenu("DoWork")]
    void DoWork()
    {
        using (new ScopedFlag(flag => isProcessing = flag))
        {
            Debug.Log($"処理中: {isProcessing}"); // true
        }

        Debug.Log($"処理完了: {isProcessing}"); // false
    }
}

処理を実行してみます。
以下の通り、コードブロック内でのみフラグがONになっています。