C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■86252 / )  Re[5]: バイナリデータを読んで、日付などの形にする方法について
□投稿者/ 魔界の仮面弁士 (1529回)-(2018/01/05(Fri) 16:27:34)
No86245 (へなちょこ さん) に返信
> Public Function TimeCal(ByVal getTime As Long) As System.DateTime
>  Try
>   Dim Time1 As System.DateTime
>   Time1 = System.DateTime.FromFileTime(getTime)
>   Return Time1
>  Catch exp As ArgumentOutOfRangeException
>   Throw
>  End Try
> End Function

動作的には間違いというわけではないのですが、
このコードについて、少しだけ指摘させてください。


実は今回提示頂いたコードというのは、実質的には下記と同等です。

 Public Function TimeCal(ByVal getTime As Long) As Date
  Return Date.FromFileTime(getTime)
 End Function


参考にしたコードを真似ただけでしょうから、上記の書き方になるのも致し方ないのですが、
実際に使う際には、必ずしも例外処理は必要ではありませんし、今回のように
わざわざ Function 化するほどの必要性も無さそうです。

ゆえに今回は、Function を作らずとも FromFileTime メソッドを直接呼び出すだけで十分かと思います。

  'x = TimeCal(longValue)
  x = Date.FromFileTime(longValue)



以下、上記の書き換えについての補足。


> Public Function TimeCal(ByVal getTime As Long) As System.DateTime

As Long と As System.Int64 は同じ意味ですし、
As Date と AS System.DateTime も同じ意味です。

Integer や Long や Date は、Visual Basic の組み込み型(プリミティブな型)で、
Int32 や Int64 や DateTime は、.NET Framework で用意された共通言語ランタイムの型名です。

どちらを使っても良いのですが、引数が前者表記、戻り値が後者表記で
混在されているのが気にかかりました。

意図的に使い分けているのであれば良いのですが、もしかしたら
Date 型の存在をご存じなかったのでは…ということで紹介しておきます。


左側が .NET Framework で対応するデータ型で、
右側が Visual Basic が組み込みで持っているデータ型の名前です。
ここでは右側(組み込み型)のアルファベット順に列挙してみました。

System.Boolean 構造体  / Boolean 型 (ブール型)
System.Byte 構造体  / Byte 型 (バイト型)
System.Char 構造体  / Char 型 (文字型)
System.DateTime 構造体 / Date 型 (日付型)
System.Decimal 構造体  / Decimal 型 (10 進型)
System.Double 構造体  / Double 型 (倍精度浮動小数点数型)
System.Int32 構造体  / Integer 型 (整数型)
System.Int64 構造体  / Long 型 (長整数型)
System.Object クラス  / Object 型 (オブジェクト型)
System.SByte 構造体  / SByte 型
System.Int16 構造体  / Short 型
System.Single 構造体  / Short 型 (単精度浮動小数点型)
System.String クラス  / String 型 (文字列型)
System.UInt32 構造体  / UInteger 型
System.UInt64 構造体  / ULong 型
System.UInt16 構造体  / UShort 型



これを踏まえた上で、
>   Dim Time1 As System.DateTime
>   Time1 = System.DateTime.FromFileTime(getTime)
>   Return Time1
で使われている System.DateTime を Date 表記に書き換えると、
   Dim Time1 As Date
   Time1 = Date.FromFileTime(getTime)
   Return Time1
のようになります。(ただの別名表記なので、どちらでも結果は一緒です)

また、必ずしも変換結果を変数に受け取る必要は無いので、上記 3 行を
  Return Date.FromFileTime(getTime)
と一行にまとめて書くこともできます。コーディングに慣れるまでは
変数に一度受けておいた方が、処理の流れを追いやすいかも知れませんけれどね。


>  Catch exp As ArgumentOutOfRangeException
>   Throw
>  End Try
今回使用した FromFileTime メソッドが ArgumentOutOfRangeException の例外を発生させるケースは
 ・引数の値が小さすぎる(getTime が 0 未満だった場合)
 ・引数の値が大きすぎる(getTime が 2650467744000000000 以上の場合)
に限られます。

つまり、最小値と最大値は下記の範囲になります。
 Dim 最小値 = Date.FromFileTime(0L)
 Dim 最大値 = Date.FromFileTime(2_650_467_743_999_999_999L)


この範囲を超えた場合は、例外処理によって Catch 句に入るわけですが、
先のコードでは、Catch 句で「単に Throw しているだけ」なので、
実際にはこのような例外処理は、ほとんど意味が無かったりします。
解決済み
返信 編集キー/


管理者用

- Child Tree -