20
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

時間の間隔定義にはTimeSpanが便利!

Last updated at Posted at 2016-02-15

はじめに

今を思い返す事XX年前。
あれは大学の二次試験の物理のテスト問題でした。

数学物理を得意としてた私は、満を持して物理のテストを迎え、問題用紙を開いた瞬間、凍り付きました。
それまでずっとミリリットルで勉強してきた私に出された問題は単位がリットル。
そう!1リットルが何ミリリットルか、思い出せなかったのです!

悩みに悩んで、出した結論は1リットル=100ミリリットル。
そして私は設問を一つ丸ごと落とし、浪人しました。

。。。ミリが1/1000を意味すると知ったのはその後ですが、人生で二度と忘れることはないでしょう。

そう言うわけで!

私はいまだに単位換算が一つのトラウマです。
そんな私の古いトラウマをえぐるのが次のようなソースコードです。

        /// <summary>
        /// ポーリング間隔:1分
        /// </summary>
        private static readonly int PollingInterval = 60 * 1000;

        static void Main(string[] args)
        {
            while (true)
            {
                // 一定時間スリープする
                System.Threading.Thread.Sleep(PollingInterval);
            }
        }

はい、非常によく見かけるソースコードですね!
このコードは2つの意味で私の不安を煽ります。

  1. 1分て何ミリ秒!
  2. Sleepの引数って本当にミリ秒指定なの!?

まぁ、1分程度ならあれからXX年経過した私には暗算余裕ですが(ミリは1/1000だし)、これが数時間とか下手したら何時間何分とかなると途端に恐怖が蘇ります。
しかし、.NET Frameworkにはそんな私のトラウマをえぐらない素敵な仕組みが最初から用意されているのです。
ご存知ですか!そう、それがTimeSpan構造体です。

上のコードをTimeSpan構造体を利用して書き直したのがこちらです。

        /// <summary>
        /// ポーリング間隔:1分
        /// </summary>
        private static readonly TimeSpan PollingInterval = TimeSpan.FromMinutes(1);

        static void Main(string[] args)
        {
            while (true)
            {
                // 一定時間スリープする
                System.Threading.Thread.Sleep(PollingInterval);
            }
        }

非常に分かりやすくないですか!?
他にも次のようなメソッドが用意されています。

        /// 日単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromDays(1);
        /// 時間単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromHours(1);
        /// 分単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromMinutes(1);
        /// 秒単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromSeconds(1);
        /// ミリ秒単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromMilliseconds(1);

これ以外に、コンストラクタ経由で時分秒指定とかもあるんですが、コンストラクタの引数の順序なんて覚えられない私には、もっぱら下のように書いてもらえると喜びます。

        /// 2時間30分
        private static readonly TimeSpan PollingInterval = 
            TimeSpan.FromHours(2) + TimeSpan.FromMinutes(30);

まぁ、引数側にTimeSpanを許容しないメソッドは.NET Frameworkの標準クラスでも多いのですが(TimerのIntervalとか)、それでも定数の可読性は高くなるはずですので、皆さんも良かったら使ってみてください。

それでは!

20
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?