試煉15 - using 不只是 using

2022 鐵人賽文 搬回點部落

開始試煉

C# using 有兩種用法 一種是程式碼最上方 引用其他命名空間的程式
using System.Text;
另一種 就是用using 將一段程式碼包起來 最後會執行Dispose
使用dapper拉資料時 應該常看到這樣的code

using (SqlConnection conn = new SqlConnection(connectionString))
{
    var result = conn.Query<Demo>("SELECT * FROM Demo").ToList();
}

然後之前常用的套件NanoProfiler也是這樣使用 就可以取得這一段程式執行的時間

using (ProfilingSession.Current.Step("ProcessRequestAsync"))
{
    //some code
}

最後看到
野人獻曝 - 極簡風格 .NET Stopwatch 計時法
黑暗執行緒 的應用 才想到可以自己寫程式應用
用黑暗執行緒的code 改出我的版本

public class StopWatchTimer : IDisposable
{
    private readonly string _message;
    private readonly Action<string> _logAction;
    private readonly Stopwatch _stopwatch;

    public StopWatchTimer(string message) : this(message, Console.WriteLine)
    {
    }

    public StopWatchTimer(string message, Action<string> logAction)
    {
        _message = message;
        _logAction = logAction;
        _logAction.Invoke($"Start {_message}");
        _stopwatch = new Stopwatch();
        _stopwatch.Start();
    }

    public void Dispose()
    {
        _stopwatch.Stop();

        _logAction($"Finish {_message} in {DispalyTime(_stopwatch.Elapsed)}");
        _stopwatch.Reset();
    }

    private string DispalyTime(TimeSpan elapsed)
    {
        var result = new StringBuilder();
        if(elapsed.Hours != 0)
        {
            result.Append($"{elapsed.Hours}h ");
        }
        if (elapsed.Minutes != 0)
        {
            result.Append($"{elapsed.Minutes}m ");
        }
        if (elapsed.Seconds != 0)
        {
            result.Append($"{elapsed.Seconds}s ");
        }
        if (elapsed.Milliseconds == 0)
        {
            result.Append($"{elapsed.TotalMilliseconds * 1000:n3}μs");
        }
        else
        {
            result.Append($"{elapsed.Milliseconds}ms ");
        }
        return result.ToString();
    }
}

做了兩個調整
1.可以傳入 Action 把資料記錄到你所寫的程式,不傳的話預設是Console.WriteLine
2.DispalyTime 我有將顯示時間做點優化 看起來比較不需要在腦中轉換單位
效果像是這樣
 

結束試煉

這樣的技巧 應該有許多應用的地方 像是在部落格文章內容時
如果有 頭尾固定要加資訊是不是也可以用這樣的方式做底去開發程式呢
就留給大家去發想了

參考
關於 C# 的 using 陳述式在實務應用上的基本觀念

如果內容有誤請多鞭策謝謝