- PR -

VBの日付型と暗黙の型変換

投稿者投稿内容
リックス
常連さん
会議室デビュー日: 2001/10/01
投稿数: 47
お住まい・勤務地: 東京
投稿日時: 2002-04-10 20:52
こんばんは。

参照元記事で、VB6.0とVB.NETでの日付型の違いを解説されていますが、
日付型の違いの説明で"2002/4/1"を日付型に代入した後でDebug.Printなど
したときの時刻部の表示の違いは、日付型の内部データ構造の違いによるものと
解説されています。

この時刻部の表示の違いは、日付型から文字列型への暗黙の型変換による
動作の違いを現すものではないのでしょうか。

些細なことですが、言語の解説記事だったためコメントします。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-04-10 22:36
引用:

リックスさんの書き込み (2002-04-10 20:52) より:
この時刻部の表示の違いは、日付型から文字列型への暗黙の型変換による動作の違いを現すものではないのでしょうか。



より正確には、System.DateTime型のToString()の実装が、現在のロケールにおける日付形式情報を取得して、それで整形した文字列を表示するようになっているからですね。暗黙の型変換というとop_Implicitを想像してしまうので、僭越ながら。

VB6のDateがデフォルトで日付部しか表示しない理由は内部動作がわからないのでわかりませんが。

でもいずれにしろリックスさんがおっしゃるように、内部のデータ構造(VB6はDoubleで.NET FrameworkではSystem.Int64)の違いはこの場合は関係ないと私も思います。
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-04-11 13:37
 まずはごめんなさい。
 間抜けなもので、時々、N-BASIC時代の感覚に迷い込みます。
 記事の解説は正しいものではありません。
 正確には、以下のようになります。

引用:

この相違は、VB 6のDate型が内部で保持する倍精度浮動小数点型を文字列に変換するルールと、VB.NETのDate型が内部で保持するDateTimeクラスの文字列への変換ルールが異なることによって発生したものである。VB 6では、何も指定せずに文字列に変換させると、"2001/01/01 00:00:00"というような日付時刻から日付部だけを文字列として生成する。これは日付と時刻を分離して扱っていた旧世代のBasic言語との互換性のための挙動と思われる。言語に対して中立な.NET Frameworkのクラス・ライブラリでは、このような互換のための配慮は継承されていないようで、単純に文字列に変換すると、条件に関係なく常に時刻を含む文字列に変換される。VB 6での動作をVB.NETでも正確に再現したい場合は、書式を明示的に指定する必要がある。



_________________
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-04-11 13:44
引用:

autumnさんの書き込み (2002-04-11 13:37) より:
VB 6での動作をVB.NETでも正確に再現したい場合は、書式を明示的に指定する必要がある。


書式を指定することもできますが、DateTimeにはToXxxStringというのがいくつかありますので、この場合はDateTime.ToShortDateStringとかを使うという手もあります。内部でやっていることは結局書式指定でしょうけど。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2002-04-11 13:56
私は、autumnさんが書いている

引用:プロフェッショナルVB.NETプログラミング 第2回 データ型の処理 (2002/04/04) より
--------------------------------------------------------------------------------
DateTimeクラスは、日付と時刻の双方を保持する機能を持つため、そのまま表示させると日付と時刻の双方を表示する。
--------------------------------------------------------------------------------
という説明も間違いではないと思います。
Dateクラスなら存在しない情報、つまり時刻情報を表示する事は有り得ないと思うからです。
ただ、全体として、完全では無かったとは思いますけど。

それより、私はこのVB.NETの例を見てて、とても違和感を感じました。
construction処理と代入処理の違いを殆ど意識していないという印象を受けます。
これらの違いは、C++から入った人は、早い段階で思い知る内容だと思います。

construction処理は、クラスをインスタンス化する上で、最も重要な処理です。
VB.NETを説明する場合に於いても、もっと意識させるべきだと感じました。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-04-11 14:09
引用:

objectさんの書き込み (2002-04-11 13:56) より:
Dateクラスなら存在しない情報、つまり時刻情報を表示する事は有り得ないと思うからです。


VB6のDate型には時刻情報も入っています。ですが、VB6開発チームが
デフォルトでそれを表示しないという決断をしただけだと思います。

引用:

それより、私はこのVB.NETの例を見てて、とても違和感を感じました。
construction処理と代入処理の違いを殆ど意識していないという印象を受けます。
これらの違いは、C++から入った人は、早い段階で思い知る内容だと思います。


.NET FrameworkではSystem.DateTimeは値型です。ですから、C++で

コード:
int i;


と書くのと、.NET Frameworkで

コード:
Dim d As DateTime


と書くのは意味的に同じです。値型は「コンストラクション」する必要はありません。値ですから。

[ メッセージ編集済み 編集者: NothingBut.NETFX 編集日時 2002-04-11 14:09 ]
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2002-04-11 14:43
引用:NothingBut.NETFXさんの書き込み (2002/04/04) より
--------------------------------------------------------------------------------
VB6のDateクラスには時刻情報も入っています。ですが、VB6開発チームが
デフォルトでそれを表示しないという決断をしただけだと思います。
--------------------------------------------------------------------------------
VB6のDateクラスには時刻情報も入っているんですか。
実際に時刻も設定出来るのに、Dateクラスなんですか?
VB6を知らずに、名前だけから判断しました。
済みません。


引用:NothingBut.NETFXさんの書き込み (2002/04/04) より
--------------------------------------------------------------------------------
と書くのは意味的に同じです。値型は「コンストラクション」する必要はありません。値ですから。
--------------------------------------------------------------------------------
これに関しては、少し違います。

私が言いたいのは、
construction処理と代入処理が基本的に違う処理である。
メモリのアサインとその内容を決定する事は、本来レベルの異なる内容であるという事です。
これを、ハッキリと意識させるのは、重要ではないでしょうか。
値型か参照型かに関係なくこの事はとても重要だと私は思っています。
値型でも、コンストラクション処理はある訳ですから。

それから、少し言葉を変えて表現すれば、
プログラムに於いて、重要なのは、
「プログラマの意志をコンパイラに伝えることの重要性」
という事でしょうか?

VB6から入ってくる場合、特に意識して貰う必要があると思いました。

NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-04-11 15:03
引用:

objectさんの書き込み (2002-04-11 14:43) より:
construction処理と代入処理が基本的に違う処理である。
メモリのアサインとその内容を決定する事は、本来レベルの異なる内容であるという事です。


すみません、私は、objectさんは川俣さんの記事の中の、次のコードのことについておっしゃっていると仮定しています(これが違うようですと話がずれてしまうのですが)。このコードはVB6とVB.NETの2つの例で共通です。

コード:
16: Dim d As Date
17: d = "2002/04/01"


このコードは、メモリのアサインとその内容の決定をきっちりわけていますよね?これのどこがいけないとおっしゃっているのかがわからないのです。

引用:

値型か参照型かに関係なくこの事はとても重要だと私は思っています。
値型でも、コンストラクション処理はある訳ですから。


値型には、C++的な意味での「コンストラクション」処理はありません。コンストラクタまがいのものが定義できるということと、C++的な意味での「構築処理」がされるということとは違います。

引用:

それから、少し言葉を変えて表現すれば、
プログラムに於いて、重要なのは、
「プログラマの意志をコンパイラに伝えることの重要性」
という事でしょうか?

VB6から入ってくる場合、特に意識して貰う必要があると思いました。


このお言葉自体には同感ですが、それでは川俣さんのコード例(またはVB6/VB.NET一般)のどこが「プログラマの意志を必ずしもコンパイラに伝えきれていない」点なのでしょうか?

スキルアップ/キャリアアップ(JOB@IT)