わがままプログラマーのあれもこれも
Amebaでブログを始めよう!

Nullable

C++で育った者としてはやはり"ポインタ"の操作に慣れてしまって、アドレスを明示的に変更してメモリアクセスsるなんてことは当たり前のことなんですね。

しかし、C#ではそういったコトが基本的には許されない処理です。(不可能ではありませんが)

そもそもC#をやり始めた頃はガベージコレクタなんてものは「ありがた迷惑だ!」とまで思っていましたので。。


C++ではよくある記述で、とあるクラスのメンバ変数があったとします。

そしてその値は全ての値(ゼロを含み-1も含む)をとりえる場合、その変数の初期化はどうするか。。

ま、一般的なのは

「int型の場合」

class SampleClass{

int* m_sampleValue;

}


コンストラクタ

SampleClass::SampleClass():

m_sampleValue(NULL) // ←NULLで初期化する

{

}


こんな感じになるんじゃないでしょうか。

ところが、これがポインタの無いC#では通用しません。

ではどうするのか。


C#2.0から"Nullable"という型が用意されました。

これは非常に便利で、こいうケースではコレが最適です。


記述方法は

int? x = null;

と書きます。(ただし、Nullableは値型のみ適応可、"string?"みたいな宣言は不可)

んで、このNullable値(System.Nullable<>と同じ)は以下の2つのメンバを持っています。

bool HasValue

T Value

このHasValueがtrueを返すときはnullではないっちゅーことです。

ちなみにNullableには"??"演算というものがあり、これはいわゆる通常の"?"のNullable版です。


int? i = null;

int k = i ?? -1; // i != null ? i.Value : -1 と同じ


さらにもう一つ、

クラスのメンバ変数がNullableかどうか判別したい時はどうするか?

まぁ、あんまりそんな機会ってないかもしれませんケド。。

そういうときは

FieldInfo fieldInfo = this.GetType().GetField("sampleValue"); // ←sampleValueというメンバ変数のFieldInfoを取得する

Type type = fieldInfo.FieldType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<> )) {…}

MSDNより参照;

http://msdn.microsoft.com/en-us/library/ms366789.aspx



実は結構このNullableって使いますヨ。
特にC#3.0になるとその存在意義が大きくなっている感じもします。

iPodでDVD鑑賞

このblog、全然更新してないですね(^_^;)、まぁゆったりまったりやっていきます。


私はiPod愛用者です。

通常はポッケに入れてイヤフォンで音楽を聴くことが多いですが、

電車や一人外食時、待ち合わせで待っているときなど、手持ち無沙汰な時間が空いた時って

音楽だけでは間が持たないって人多いと思います。

そんなときはiPodでDVDです。


意外と多くの人がiPodでDVDの映画などが観られるコトを知らないんですね。

私はよく「えっ!?今iPodで映画観てなかった?そんなことできるの?」

なぁ~んて言われます。みなさんはどうでしょうか?

もちろんiPodで映画は観られますヨ。

ただ、DVDの中身をそのままコピーっていうような簡単にはいかないんですけどね。

知っている人は多いでしょうけど、知らない方の役に立てればと思いこの記事を書きました。


DVDのファイルをMPEG-4という形式に変換しないとiPodでは観られません。

以下に私が愛用している変換アプリを紹介しておきます。


私が使っているのは「HandBrake」というアプリ、

http://handbrake.fr/

ココから誰でもフリーでDownloadできます。メールアドレスの登録などわずらわしい作業も不要!

DLしてインストールするだけ。か~んたん♪

しかもプラットフォームはMac、Windows、Linuxともに対応(インストーラがそれぞれ別々にリンクされています)

ただ、GUIは英語です。英語ですが、簡単です。iPodの操作ができる人なら誰でもできます。


"Source"部分にDVDドライブの中のファイルを指定して、"Destination"に出力するMPEG-4ファイルパスを指定すればOK!あとは"Presets"を"iPod High-Rez"か"iPod Low-Rez"に設定しておくのを忘れずに!

これで準備万端!あとは"Start"ボタンを押してひたすら待つだけ。

マシンスペックにもよりますが、Pentium4 3Ghz 500MB RAMの私のマシンでは2時間のDVDが約3時間で完了しました。

「3時間もかかるのかよ!!!」って思ったそこのアナタ、DVDなどの映像のフォーマット変換って時間のかかるものなんです。我慢してください。我慢できない方はハイスペックな新しいPCを買ってください。


無事MPEG-4ファイルが作成されたら、iTunesを起動して[ファイル]メニューの中から[ファイルをライブラリに追加]を選択して、先ほど作成したMPEG-4ファイルを指定すれば全て完了。

iPodを接続して同期すればあっという間にiPodが小さな映画館に生まれ変わります!(^^)!


知らなかった方はぜひやってみてください。

英語も勉強に海外ドラマを入れて通勤中に見るだけでも効果は絶大だと思いますヨ♪

変な英会話PodCastを聞くより全然マシです!

C# 3.0:ラムダ式

当ブログの初めての記事が"ラムダ式"かい!(笑)

まぁまぁ。。


C# 3.0を最初に使った時に、こんなコードが出てきて「ん???」となった。


Function<int, int> func = x => { return x + 1; };


この突然出てきたxってなぁに??ってね。

これがラムダ式というやつです。(まぁ皆さんもう知ってるってか…)


要するに、上記式はC# 2.0 で書くところのこれの略なんですねー。

Function<int, int> func = delegate(int x){ return x + 1; };


C# 3.0ラムダ式では、

Function<int, int> func = (int x) => { return x + 1; };

と書きます。C# 2.0のdelegate記述とほとんど代わり映えしませんね。

ところが、これは以下のように省略できるのです。


Function<int, int> func = (int x) => x + 1;

そしてこれが更に
Function<int, int> func = (x) => x + 1;

でもって、
Function<int, int> func = x => x + 1;

こんなもん突然見たらワケわかんねーっしょ。ラムダ式って必要かい??

関数型言語を使い慣れてる方にはいいのかな??