前置き
ふっふっふ。
本当は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の書き方からはちょっと離れちゃってる感じがしなくはないですけど、やりたい事は出来ているのでこれで良いよねー
って思いました。