スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門基本編落穂拾い その27 (box,unbox)

.NETのライブラリ関数には、System.Object型を引数にとる関数が多々あります。
System.Object型はF#ではobj型ですが、F#の任意の型をobj型に変換する関数がboxです。
 
> box;;
val it : ('a -> obj) = <fun:it@1>
 
> let objInt = box 1;;
val objInt : obj = 1
 
> let objStr = box "abcdef";;
val objStr : obj = "abcdef"
 
オブジェクトの殻(箱)に包んでしまうという感じでしょうか。
 
それでは、包んだものの中身をとりだすのはunbox です。
 
> unbox;;
val it : ('a -> 'b) = <fun:it@4-1>
 
ただ、unboxを使用するにはどの型として中身を取り出すかの指定が必要です。次のように指定します。
 
> unbox<int> objInt;;
val it : int = 1
 
> unbox<string> objStr;;
val it : string = "abcdef"
 
変換不可能な型を指定してunboxを使用すると次のように例外が発生します。
 
> unbox<int> objStr;;
 
System.InvalidCastException: Specified cast is not valid.
   at <StartupCode$FSI_0008>.$FSI_0008.main@()
Stopped due to error
 
また次のように、型指定もできます。
 
> (unbox objInt : int);;
val it : int = 1
 
なおMSDNによるとbox,unboxは次のように説明されています。
値型がオブジェクトのように動作する必要がある場合、値型を参照オブジェクトのように見せるラッパーがヒープ上に割り当てられ、その値型の値が割り当てられたラッパーにコピーされます。ラッパーは、その中に値型が格納されていることがシステムにわかるようにマークされます。このプロセスはボックス化と呼ばれ、その逆のプロセスはボックス化解除と呼ばれます。ボックス化とボックス化解除によって、すべての型をオブジェクトとして扱うことができます。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。