もり ひろゆきの日々是勉強

日々思ったことやIT関連のメモなどをのほほんと綴っていきたいと・・・。(^^;

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  1617  : 記事  12  : コメント  2033  : トラックバック  144

ニュース

Microsoft Innovation Center

MICでは各種無償セミナーを実施しています。
こちら
そして、スピーカーは僭越ながら私がお話させていただいております。
一生懸命努めさせていただきますので、よろしければご参加くださいm(__)m

コミュニティはじめました。

  • そんなワケでコミュニティをはじめました。

    その名も極東IT Engineersです。

    もちろん、新規登録無料のオープン制SNSです!

    IT Engineerをつなげるコミュニティとして活動しておりますので是非みなさんもご参加ください!

自己紹介

  • もり ひろゆき(森 博之)と申します。

    極東IT Engineersというコミュニティの代表です。

    本業は東京でソフトウェア開発のお仕事をしております。いわゆるDeveloperですね(^^;

    仕事ではVB,C#といろいろと渡り歩いてはおりますが、主に.NET系の業務アプリの開発が多いです。

    というか仕事となったら必死で何でも勉強しますが(^^;;;;

    最近ではMicrosoft Innovation Centerで講師もさせていただいておりますが、撃たれ弱いのでお手柔らかにお願いしますm(__)m

    まったく関係ありませんが、たこ焼き機も持っています。 関西人です。

Microsoft MVP

MCP


  • 70-316 Developing and Implementing Windows-based Applications with Microsoft Visual C# .NET and Microsoft Visual Studio .NET

    70-536 Microsoft .NET Framework 2.0 - Application Development Foundation


  • MCTS: :.NET Framework 2.0 Web アプリケーション
    70-528 Microsoft .NET Framework 2.0 - Web-based Client Development


  • MCTS: Microsoft SQL Server 2005
    70-431 Microsoft SQL Server 2005 - Implementation and Maintenance

Wankuma MVP


  • Wankuma MVP for OOO(= Original Object-Oriented)

iKnow!

etc.

  • 人気ブログランキング - もり ひろゆきの日々是勉強

    スカウター : もり ひろゆきの日々是勉強

    あわせて読みたい

書庫

日記カテゴリ

リンク

キャストとConvertを混乱してしまうよーという、そんなあなたのためのエントリです(^o^;

まず、順番にいきましょう。
文字列から数値に変換してくれるメソッドが.NETにはいっぱいあります。
.NET Frameworkで用意されているものでは、Integer[int]を例にすると・・・

VB C#
Integer.Parse   int.Parse
Integer.TryParse   int.TryParse

これらは引数がStringである必要があります。
つまり、Stringから数値に変えてくれます。
(つまりStringが指定されていなければコンパイルエラーになります)

これに対してstring型以外のものも変換してくれるものがクラスライブラリにあります。

System.Convert.Int32()
System.Convert.Int64()

などそうですが、これは引数がObject型となっているので、どんなもんでも変換しようとしてくれます。
(ちなみにVB.NETのCIntも引数はObject型ですので、おそらくこのConvertと同じような動きになると思います)

もちろん、両者、変換できないものは(TryParseはともかく)Exceptionがthrowされることになります。

でもって、キャスト(Cast)ですが、これは明示的型変換とあるように、そのものを強制的に型変換しようという仕組みです。
つまり、ConvertやParseは文字から数値といった変換をしてくれるものでしたが、こいつは型を変換してしまうのです。

つまり、極端なことをいうと

Dim strValue As String = String.Empty

となっているものを

Dim intValue As Integer = DirectCast(strValue, Integer)

とやっても構文エラーにはなりません。 実行時エラーにはなるでしょうけど(^^;

つまり、値は変更せずに型だけを変換しようとします。

じゃ、本来どういったときに利用するか・・・ですがわかりやすいのはイベントハンドラの引数なんかがそうですね。

そう、ButtonClickとかのあれです。

ここに指定されている引数では

Private Sub ButtonClick(sender As Object, e As EventArg) Handles btnButton.Click

なんちゅうー感じで指定されて、そのsenderに実際にイベントの発信元となるコントロールのインスタンスが入っていたりします。

でもって、イベントハンドラは

Private Sub ButtonClick(sender As Object, e As EventArg) Handles btnButton1.Click, btnButton2.Click, btnButton3.Click

という感じで複数のイベントを1つのメソッドでハンドルすることができたりします。

この時に、どこから来たイベントを判断するのに

If sender Is btnButton1 Then

とIs演算子で判定すれば、発信元が特定できるようになります。つまり、どこから飛んできたか知る必要がある場合はIs演算子で判断する・・・といったこういう使い方をすると便利なんですね。

まま、もちろん他にも利用方法はいろいろあると思います。

というワケで、ざっくりでしたがキャストとConvertやCInt,Parseなどの違いがわかったでしょうか?(^^;;;;

投稿日時 : 2007年3月8日 13:54

コメント

# re: おれとCastとParseとSystem.Convert 2007/03/08 14:12 シャノン
> 文字列から数値に変換してくれるメソッドが.NETにはいっぱいあります。

TypeConverter.ConvertFrom/ToString なんてのもあります。
相手を文字列に限らなければ BitConverter なんてのもあります。
オブジェクトから文字列への変換なら、ToString に加えて、ICustomFormatter なんてのもあります。
もうごちゃごちゃですorz

> こういったObject型にコピーしたり、Object型から元の型にコピーして戻したりすることをボクシング・アンボクシングといいます。

違います。
boxing / unboxingは、値型と参照型の相互変換です。

> この機構を使ったので有名なのがイベントハンドラですね。

それはただのアップキャストです。

# re: おれとCastとParseとSystem.Convert 2007/03/08 14:13 シャノン
IFormattableもあった…

# re: おれとCastとParseとSystem.Convert 2007/03/08 14:22 中博俊
ボクシングの説明に重大な過誤があります。
参照型をObjectにするのはただのアップキャストしてるだけです。
ボクシングは実体型を参照型に変換する仕組みで値のコピーを含みます。コピーして参照の箱に詰め込むことをボクシングといいます。

# re: おれとCastとParseとSystem.Convert 2007/03/08 14:30 ひろえむ
すげー勢いで突っ込みが入ってしまった。
早すぎです(^^;
まだ、自分でチェックもしていないのに(^^;;;;;
それも含めてあとで直しますー(^^;

# re: おれとCastとParseとSystem.Convert 2007/03/08 15:48 ひろえむ
#シャノンさん、中さん
というワケで、ボクシング・アンボクシングについては削除しました(^^;
これをちゃんと説明するには値型と参照型の違いを説明しないといけなくなりそうですし(^^;
でも、完璧にアップキャストと混乱しておりました(^^;
ご指摘ありがとうございましたm(__)m

# re: おれとCastとParseとSystem.Convert 2007/03/08 16:56 キヨ
キャストとConvertクラスとでは、変換の内部ロジックが異なるので、それぞれの実行結果は異なるものになる可能性があります。要するに、
 ・Convert.ToInt32(d) と
 ・(int)d  ※ dは実数型変数
とでは、結果が異なることがあります(同じになることもあります)


また、Convertクラスは.Net Frameworkで規定された動作をします。
そのため、C#でもVBでも、Convertクラスで変換した結果は、同じ値になります。


しかし、キャストは各言語によって規定された動作をします。つまり、
 ・(int)d  (C#)
 ・CInt(d)  (VB)
とでは、異なる結果が得られることがあります(同じになることもあります)


ややこしいですよね・・・(笑)

複数人で数値処理のプログラムを書くときには、使用言語や型変換のルールを事前に統一しておくのが望ましいかと思います。

# re: おれとCastとParseとSystem.Convert 2007/03/08 17:00 キヨ
↑ あいさつ文が抜けており、失礼しました。

このブログでは初めての書き込みになりますが、勉強会では何度もひろえむさんを拝見しております。

こちらのブログも、ためになる情報が多くて、いつも拝見しております。
今後とも、よろしくお願いします。

m(_ _)m

# re: おれとCastとParseとSystem.Convert 2007/03/08 22:20 ひろえむ
#キヨさん
ご挨拶がまだでしたっけ(^^;;;
すみません、どの方にご挨拶したのか全然覚えておりません(^^;
こちらのほうこそ、よろしくお願いいたしますm(__)m
ためになる情報ありましたか?(^^;; それはよかった(^^;

で・・・
>キャストとConvertクラスとでは、変換の内部ロジックが異なるので、それぞれの実行結果は異なるものになる可能性があります。要するに、
> ・Convert.ToInt32(d) と
> ・(int)d  ※ dは実数型変数
>とでは、結果が異なることがあります(同じになることもあります)

というか、このエントリの趣旨はキャストとConvertとParseはどれも別モノなのよってのが主旨ですね(^^;

なので、それを同列で並べちゃうと混乱しちゃうよーってことが言いたかったのでした(^^;

ちなみにVBのCIntはC#の(int)[キャスト]とは性格がちょっとちゃうような気がします。
どちらかというとCIntの動きはSystem.Convertに近いですね。

ちなみにVBのCTypeとDirectCastも別物です。

ただ、ぶっちゃけ、私はInteger.ParseでもCIntでもTryPaseでもSystem.Convertでも、目的が達成できるのであれば、CPUコストにかかわらず、どれでもいいと思っています(^^;

何十万回実行して違いがわかるようなコストを切り詰めないといけない場面は、業務アプリを作る上では、そう出てこないと思います(^^;

それより、むしろ可読性の高さを優先しますねー。
なので、他で統一された表記やコードがあれば、それにあわせる方を選びますね(^^;
それがバラバラなら、少なくとも関連する処理にあわせたいって感じでしょうかねー(^^;;;;

# re: おれとCastとParseとSystem.Convert 2007/03/11 8:50 アクア
ただ今、この件で楽しんでます。^^;;;

参考になります。

# re: おれとCastとParseとSystem.Convert 2007/03/11 16:13 ひろえむ
#アクアさん
頑張ってくださいねー(^^)

# Cast 2007/10/11 7:06 Mr.Tの場所
Cast

Post Feedback

タイトル
名前
Url:
コメント