前置き
ふっふっふ。
本当はC#
のusing
ステートメント的な記述をイメージしているんですよ。
でも、With
って云った方が喰い付きが良い様な気が…
でも結局はC#のキーワードには存在しない「With」
の方が実装には便利だったりしてね。
背景
すまん。
私、VB使いではないので「With」
じゃなくて、using
の方で説明させて下さい。
どういう事かと云うと―
using(FileStream fs = new FileStream(FileName, FileMode.Open)) {
fs.Name~
fs.Length~
fs.Position~
}
ってやると、using
ブロック内だけで有効な変数fs
が定義される。
ま、本当の意味は、リソースの廃棄が必要なオブジェクトの生存期間の明示的な記述を言語文法レベルでサポートしている、と云う事ですね。
でも、リソースの廃棄が必要なオブジェクトでないとこの書き方はできない(=IDisposable
を継承している必要がある)ので例えば―
using(Rectangle rect = new Rectangle(x, y, w, h)) {
rect.Bottom~
rect.Right~
}
みたいな使い方はできない。
例が悪くて申し訳ないですけど、こんなことが出来たらいいのになー
と思った事は一度や二度ではない筈。
で、どうするか
Extension
ですよ。
public static class ExtentionClass {
public static void With<T>(this T Me, Action<T> action) => action(Me);
}
ってのを定義しておくと
listView1.Items[index].With((obj) => {
obj.SubItems[0].Text = "aaa";
obj.SubItems[1].Text = "bbb";
obj.SubItems[2].Text = "ccc";
});
こんな感じでlistView1.Items[index]
のインスタンスをWithブロック
内に閉じたobj
の名前で参照できちゃいますね。
だいぶWith
に近くないですか?
一方using
の書き方からはちょっと離れちゃってる感じがしなくはないですけど、やりたい事は出来ているのでこれで良いよねー
って思いました。