- - PR -
VBのWithってC#でどう書くんですか?
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-02-18 14:10
そうですね、バグの温床にもなるので構文レベルでサポートするのが 1 番でしょう。 それこそが With ステートメントなわけですので、代わりになる機構がないように思えます。
この目印のために、With ステートメントは存在し、インデントが存在するんですよね。 インデントに関しては、メソッド内から見たルート位置からのインデントであれば、 そこまで可読性が落ちるわけでもなさそうです。 明らかに可読性が落ちると感じるのは、ルート位置からのインデントでない場合と、 With ステートメント内で別のインデントが発生する場合だと思います。 (そういう書き方 "も" できること、そういう書き方をする人が多い (orz) ことは問題ですがw)
今回の例だと、クラス直下のメンバなので、別の参照に取る利点はない... というのはおいといて、 この書き方だと、素直にそのまま書いたのと大差がないような気がします。 With と比べた場合に、その大差がない理由のひとつとして、 変数が変わった場合の置換ミス防止などがあげられます。 別の変数に代わった場合に、全部置換することになりますので、 この書き方であっても With ステートメントの保守的な意味合いをひとつ逃しているんですよね。 1 箇所のみ置換すれば良いとか、そういう次元だったりするんですが、 With ステートメントの利点ってそういう限定的なことでしか思いつかないんですよね。 あとはスコープの範囲がありますが、この点は C# には機構がありますしw コンパイラが賢くなった今、この程度であれば素直にそのまま書いた方が良いでしょうね。 # ああ、相変わらずうまく書けてない。orz _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-02-18 14:43
あ、最初に私が書いたトリッキーなアレの話はコレなんですよねw C# には { } で、限定的なスコープにしてしまえる機構があるわけですが、 VB で、代わりとなりそうなのが、こういう With ステートメントの使い方ですよね。
あまり良い例ではないかもしれませんが、ComboBox へのバインドが例になっています。 回避方法はあるので、こんな書き方する必要はないんですが、 回避方法が面倒という場合には、たまに使ったりしますね! (w 今回のようにする利点として、スコープの有効範囲が見やすいこと、 他では使っていないことを明示化できることがあげられます。 このブロック外ではアクセスできないのですから、安全であることが保証できます。 「"同名の" 安易な変数名」が使えることも利点でしょう。 通常、変数名は厳密な名前を付けるべきですが、 あまり重要でない変数には、安易な名前をつけた方が良い場合があります。 今回の例で考えると、"item" に対して別々の名前をつけた場合、 「他の変数名が際立たなくなる」もしくは、 「大した意味はないのに、意味があるかのように見えてしまう」という副作用を生みます。 これは、For で配列を取り出す場合の "ループ変数" に厳密な名前を付けた時の副作用と同じですね。 そういった理由で、「同名の安易な変数名」と「限定されたスコープの変数」を使いたくなることはありますね。 # すいません、うまく説明できていません。(;_ _) でもなぁ、これだったら、If True Then と書いた方が良いかもしれませんね。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-02-18 14:49
同じようなことを考える人はいるようで、、、
http://www.gotdotnet.com/team/ja/team/csharp/learn/columns/ask.aspx http://cspc.jp/~eclipse/archives/000699.html http://www.hey-to.net/ML-archive/vcppML/2000/msg07130.html with を使わないようにリファクタリングされるそうです http://www.ailight.jp/blog/papanvb/archive/2005/09/12/9707.aspx | ||||||||||||||||||||
|
投稿日時: 2006-02-18 15:12
これは目から鱗ものですね。 しかし僕は VB6 使いだったので、ブロック内のみ有効スコープな変数を使うことさ えできませんでしたが。 {} は Perl で多用していました。
僕が VB6 の頃によく使っていた手も有効かも知れません。
後始末が必要な場合は、大体この書き方でした。
僕があれだけキーワードを駆使して調べられなかったのに、何気にたくさんの情報 収集ができてしまうのですね。 僕は調べるのが下手なんだろうか orz [ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-02-18 15:21 ] [ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-02-18 15:22 ] | ||||||||||||||||||||
|
投稿日時: 2006-02-18 15:38
R・田中一郎さん、こんにちは。
ドットで始まらないと、メンバなのかどうかが判別できないような気が…。 #ドットを打つと同時にインテリセンスが働いてくれるので、入力が楽だったりしますね。 | ||||||||||||||||||||
|
投稿日時: 2006-02-18 15:52
これに関して言えば、 「with ブロック内は with で指定したオブジェクト以外に関する記述はできない」 「with に限らず他のブロックを入れ子にすることはできない」 「メソッドの呼び出しはできない」 「...というより、プロパティなどの初期化にしか使えない」 という仕様にすれば少しは解決しそうなんですけどね。 可読性が損なわれる、の多くは VB プログラマ (ただし、困った人のみ) に多い、 複雑な With ステートメントの書き方を危惧してのことでしょうから。 たとえば以下のような使い方は、本人以外は読みにくいと感じるでしょう。
(1) にあるように、With で指定したオブジェクトと関連のないメソッドの呼び出しとか。 (2) にあるように、別のステートメント ブロックが入れ子で入ってしまったりとか。 (3) にあるように、For に .Count なんてあったりとか。 (For ステートメントは最初の 1 行で "すべて" が把握できる機構になっているのに、それを壊している) こういう使い方をある程度防止できれば、まだマシでしょうね。 とはいえ、私も反対寄りの意見になると思います。 深いネストでの使用については、コンパイラで叱り付けるのは難しいでしょうからね。 個人的な意見ばかりになってしまいましたが、たとえ、VB6 であっても、 With ステートメントは、プロパティの初期化くらいにして欲しいものです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-02-18 15:59
そう言えば C# 3.0 のインスタンスイニシャライザがまさにそれですね。 | ||||||||||||||||||||
|
投稿日時: 2006-02-18 16:20
以下の初期化記法のことですね? # イニシャライザと聞いて、静的コンストラクタを真っ先に思い浮かべ、 # でも、インスタンスって書いてあるし、うーん。と、しばらく考えこんでましたw
ブロックみたいに書くならば、
多分、こんな感じかな。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |