- PR -

VBのWithってC#でどう書くんですか?

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-19 16:51
引用:

R・田中一郎さんの書き込み (2006-02-18 15:12) より:

僕が VB6 の頃によく使っていた手も有効かも知れません。
(snip)
後始末が必要な場合は、大体この書き方でした。


ちょっと例となるコードの意味合いが判らなかったのですが、
後始末についてはこれではダメだと思います。

VB6 の場合は On Error GoTo Finally みたいにして Close を保証します。
独自のクラス モジュールであれば、デストラクタ (参照カウントのデクリメント) である、
Terminate イベントで解放するのが安全かと思います。(ローカル スコープでないと危険ですが)

この場合には、Set obj = Nothing による参照の解放は不要です。
メソッドの最後にまとめてやってあるソースを見ますが、無駄以外何者でもないです。
なぜならば、スコープを抜ければ自動で参照カウントはデクリメントされるからです。
スコープを抜ける直前にそんなことされても... (すぐ同じことをなされるというのに)

もし、Set obj = Nothing を書くのであれば、
それはメソッドの途中で「なるべく早く Terminate したい」時だけです。

引用:

きくちゃんさんの書き込み (2006-02-18 15:38) より:

ドットで始まらないと、メンバなのかどうかが判別できないような気が…。


これは、With ブロック内は最初に指定したオブジェクトに属するメンバ以外は、
一切記述できないようにしてくれれば解決できそうですよね。

むしろ、With ステートメントの役割としてはそれが正しい気がします。
VB でも Wish したいんですが、過去の遺産との互換性で却下されるでしょうね。(;_ _)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-02-20 09:14
引用:

きくちゃんさんの書き込み (2006-02-18 15:38) より:
R・田中一郎さん、こんにちは。

引用:

しかし、With の何が嫌って .Width のように . から始まるところです。

なので、


ドットで始まらないと、メンバなのかどうかが判別できないような気が…。

#ドットを打つと同時にインテリセンスが働いてくれるので、入力が楽だったりしますね。




僕もそう思ったのですが、これは

コード:
ParentProperty (this.TextBox1) {
       Name  = "名前"
        Width = 256
        Text  = "テキスト"
        Font  = Me.Font
}
#むしろ、PropertySetting (this.TextBox1) の方がしっくりくるかな・・・


の前フリなのでOKとして下さいw。

引用:

じゃんぬねっとさんの書き込み (2006-02-19 16:51) より:
引用:

R・田中一郎さんの書き込み (2006-02-18 15:12) より:

僕が VB6 の頃によく使っていた手も有効かも知れません。
(snip)
後始末が必要な場合は、大体この書き方でした。


ちょっと例となるコードの意味合いが判らなかったのですが、



すみません。例として分かりにくかったです。
結局、 do〜loop while false でブロック化してたと言いたかっただけなのでしたorz
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-20 09:24
引用:

R・田中一郎さんの書き込み (2006-02-20 09:14) より:

すみません。例として分かりにくかったです。
結局、 do〜loop while false でブロック化してたと言いたかっただけなのでしたorz


それだったら、With Me の方が「意味がない」ことを強調できると思いますよ。
Do 〜 Loop While False だと、先頭を見ただけでは意味があるものに見えません。

しかし、VB に空のステートメントによるブロック機構が生まれるとしたら、どういうスタイルになるんだろう...
何かにつけて、End 〜 (End Sub, End Function, End If, End While) なので、

コード:

    Block

    End Block


とか? (イヤーw)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-02-20 09:45
引用:

じゃんぬねっとさんの書き込み (2006-02-20 09:24) より:
しかし、VB に空のステートメントによるブロック機構が生まれるとしたら、どういうスタイルになるんだろう...
何かにつけて、End 〜 (End Sub, End Function, End If, End While) なので、


もちろん、
Begin
End Begin
でしょう…
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-02-20 09:45
VBのWithは、けっこう使いました。
もっとも、頻繁に呼び出されるような処理でなければ、速度的なメリットはどうでもいいと思いますが。
とりあえず「楽ができるのはVBだけ」とか考えて、他では無くてもいいと思っていました。

言語が離れてしまいますが、JavaScriptのwithは、ピリオド要らないんですよね…。

with (fooObject.style) {
left = "10px";
top = "10px";
display = "block";
}

ピリオドがあるほうが、まだ分かりやすいと思うんですが…。

ついでに、JavaScriptのwithは、実行速度にさほど影響しないようで。
分かりづらさもあり、JavaScriptでは大抵一時変数です。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-02-20 13:57
引用:

じゃんぬねっとさんの書き込み (2006-02-19 16:51) より:

これは、With ブロック内は最初に指定したオブジェクトに属するメンバ以外は、
一切記述できないようにしてくれれば解決できそうですよね。



引用:

R・田中一郎さんの書き込み (2006-02-20 09:14) より:



ああ、左辺限定、って事ですね?

そうすると、こういう書き方↓は使えなくなりますね。

コード:
With Hoge
    .Text = "hogehoge"
    .ToolTip = .Text
End With


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-20 14:21
引用:

なちゃさんの書き込み (2006-02-20 09:45) より:

もちろん、
Begin
End Begin
でしょう…


えー、旧 VB のアレに習ってですか。

コード:

   Begin VB.CommandButton Command1 
      Caption         =   "Command1"
      Height          =   495
      Left            =   6240
      TabIndex        =   19
      Top             =   6240
      Width           =   2295
   End


確かに「End」だと「End ステートメント」と区別が付きませんねw
でも、Begin End って...

引用:

きくちゃんさんの書き込み (2006-02-20 13:57) より:

ああ、左辺限定、って事ですね?
そうすると、こういう書き方↓は使えなくなりますね。

コード:

    With Hoge
        .Text = "hogehoge"
        .ToolTip = .Text
    End With




そうですね。

コード:

    With Hoge
        .Text = "hogehoge"
        .ToolTip = Hoge.Text
    End With

コード:

    Dim tempText As String = "hogehoge"

    With Hoge
        .Text    = tempText
        .ToolTip = tempText
    End With


うーん... (~_~;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-02-20 16:46
引用:

じゃんぬねっとさんの書き込み (2006-02-20 09:24) より:

それだったら、With Me の方が「意味がない」ことを強調できると思いますよ。



そうなんですよね。
意味がないことを強調させることが意味のあることなんですよね。

引用:

じゃんぬねっとさんの書き込み (2006-02-20 09:24) より:

コード:

    Block

    End Block


とか? (イヤーw)



仕方ないです。End ○○ とした時から運命は決まっているのです。

引用:

なちゃさんの書き込み (2006-02-20 09:45) より:

もちろん、
Begin
End Begin
でしょう…



End Begin って表現は個人的には嫌いじゃないですw

引用:

mioさんの書き込み (2006-02-20 09:45) より:

ピリオドがあるほうが、まだ分かりやすいと思うんですが…。



分かりやすさの点では、 .Width の方が良いことは賛成です。
でも、何か気持ち悪いです。書きかけのコードみたいな・・・

引用:

きくちゃんさんの書き込み (2006-02-20 13:57) より:

ああ、左辺限定、って事ですね?

そうすると、こういう書き方↓は使えなくなりますね。

コード:
With Hoge
    .Text = "hogehoge"
    .ToolTip = .Text
End With






それで良いと思います。
と言うか、そもそもの発端は、省略した変数がそこかしこに記述されるのは、あまり
好ましく無いんじゃないかという点でしたから。

引用:

じゃんぬねっとさんの書き込み (2006-02-20 14:21) より:

コード:

    With Hoge
        .Text = "hogehoge"
        .ToolTip = Hoge.Text
    End With

コード:

    Dim tempText As String = "hogehoge"

    With Hoge
        .Text    = tempText
        .ToolTip = tempText
    End With


うーん... (~_~



コード:
    With Hoge
        Text = "hogehoge"
        ToolTip = Hoge.Text
    End With



これで良い気がします。
# そもそも何故 With という言葉なんでしょう。

スキルアップ/キャリアアップ(JOB@IT)