LoginSignup
2
4

More than 3 years have passed since last update.

C#でVBの「With」風な記述をしてみる

Last updated at Posted at 2019-04-22

前置き

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

2
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4