不定期TomBlog

目次

Blog 利用状況

書庫

Withブロック変数

Withブロック変数は使用しますか?

Withブロック変数を使用すると、
・コードが直感的でない
・無駄にインデントされる
・デバッグしづらい
などの理由から使用するのを避けていました。

Withを使用した方が処理が早いという
噂を聞いたので、確認してみましたが、
特に差はありませんでした。

文字列に&で文字列連結を50,000回繰り返した
結果は以下の通り。

With未使用   With使用
154.1314304   152.3490672
152.6094416   153.72104
149.3848048   149.7953952

みなさんはWithブロック変数を使用しますか?

投稿日時 : 2007年8月26日 23:24

コメントを追加

# re: Withブロック変数 2007/08/27 0:22 Ognac

VB.IDEのEditorを自動編集ONで使う時は WIthを多用します。
Withの使い方としては邪道で、インデントの目的で使っているだけですが
With "接続子"
Dim childElement As System.Xml.XmlElement = xmlDoc.CreateElement("接続子")
rootElement.AppendChild(childElement)
With "MsSQL:SqlServer"
Dim childElement1 As System.Xml.XmlElement = xmlDoc.CreateElement("SqlServer")
childValue1 = xmlDoc.CreateTextNode(TB_MsSqlConnectionStr.Text)
:
:
End With
With "Oracle:xxx"
:
:
End With
End With

C#.IDEの自動編集は {}で括っても単独{}は頭がそろうので気に入らないですね。

そんなんで、 自動編集 Offにすることが多いこのごろ

# re: Withブロック変数 2007/08/27 0:23 Ognac

あっ,コメントの時は頭のBlankが抜ける(ごめんなさい)

# re: Withブロック変数 2007/08/27 1:01 中博俊

Withをどんどん使えと言われたのは、VB6時代の話です。

# re: Withブロック変数 2007/08/27 9:21 まどか

ついでに言うと
> 文字列に&で文字列連結を50,000回繰り返した
中で何をするかではなく
.Propertyの「.」の参照先がコンパイルされるのがObject.Propertyより速い理由です。

# re: Withブロック変数 2007/08/27 9:30 じゃんぬねっと

With ステートメントを使った方が早いというのは VB6 時代の話ですね。深い object 層で試すと確かに差はあります。しかし VB6 時代でさえも私は使うのを嫌いました。

確かに変数を一括で変更する時には便利でした。変更時のバグの温床を減らすことができました。が、デメリットも多く、きちんとルールを決めないと可読性を損ねて本末転倒になります。

また最近ではリファクタ機能もありますから、変更漏れなどありえないのですよね。そもそもテストがきちんとなされていれば問題ないわけで。

With ステートメントは .NET 以降では空のブロックを作ること以外に使い道などないと思います。個人的には。私の Blog のどっかにそういう記事があります。

# re: Withブロック変数 2007/08/27 11:29 Tom

みなさん、貴重なご意見をありがとうございます。
参考にさせていただきます。

>じゃんぬさん
『私の Blog のどっかに…』
探すのが大変でした。(^^;

2006/11/07
VB.NET で C# の { } 空ブロックと同じことをするには?

こんな使い方ができるんですね。
知りませんでした。
機会があれば使ってみます。

# re: Withブロック変数 2007/08/27 12:18 ひろえむ

どんどん使えとはいいませんが、やはり適材適所がある気がしますねー。

だからって絶対使わないってもナンセンスですけどね(^^;

使い方によってはすっきりしたコードがかけると思いますよー。

# re: Withブロック変数 2007/08/27 15:20 通り☆

>>Tomさん
単に変数を都度書く代わりにWithにする話でしたら違いはないと思いますが、どのようにインスタンスが戻されるかによっては、Withが有効な場合もあると思います。
Public Class Test
 Public ReadOnly Property Hoge() As Test
  Get
   '重い処理
   System.Threading.Thread.Sleep(1000)
   'インスタンスが生成される
   Return New Test()
  End Get
 End Property
End Class
のようなクラスでは、HogeをWithするか都度参照するかでは大きく違いがでてきますので~
変数に限った話をされていたのでしたらすみません~

>>Ognacさん
>Withの使い方としては邪道で、インデントの目的で使っているだけですが
おもしろい使い方ですね!
文字列リテラルもオブジェクトだとはわかっていても、この発想はできませんでした。
「~の処理」とコメント付けておくだけでは区切りがわかりづらいけど、関数を分けたりResionで囲ったりするのにはちょっと大げさって時に使えますね~

タイトル  
名前  
URL
コメント