- PR -

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

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-02-18 10:16
本当につまらない質問で申し訳ないです。
ぐぐっても入門サイト系を探しても見つからなかったので堪忍して下さい。

コード:

With Me.あるコントロール
    .Visible = False
    .Text = "手当たり次第にC#に変換中!!"
End With


lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2006-02-18 10:36
 たぶんないっすね。適当に変数に収めて短くする…。インデントはつかない:

コード:
さるコントロール with = this.あるコントロール;
with.Visible = false;
with.Text = "手当たり次第にC#に変換中!!";

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-02-18 10:45
C#にはないです。
.NET FrameworkはVBとC#で同じものを使えますが、文法はそれぞれの特徴があるので
必ずしも置き換えられる記述があるとは限りません。

this.あるコントロール.Visible = False
this.あるコントロール.Text = "手当たり次第にC#に変換中!!"

と書くしかないですね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-18 10:59
VB の With は可読性が宜しくないので個人的には嫌いです。
「見やすいから」と言ってる方もいましたが、組んだ人でないと見にくいものですよ。

# そういう人に限って、すごい大きなブロックで使ったりしてるから、
# どこのショートパスなのか本当に全然わからないw

VB6 時代はパフォーマンスをあげることができましたが、
VB7 以降はコンパイラが賢くなったおかげで、使いどころがないですね。

C# のブロックを代行させるためにトリッキーに使用することがありますが! (w
こんな方法で使っている人も少ないでしょうね。
聞かない方がいいですよw

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-02-18 11:30
無いんですね。
探しても見つからないので「もしや無いのか?!」と思ってもみたのですが。

引用:

じゃんぬねっとさんの書き込み (2006-02-18 10:59) より:

VB の With は可読性が宜しくないので個人的には嫌いです。
「見やすいから」と言ってる方もいましたが、組んだ人でないと見にくいものですよ。



VB6 の頃は、処理速度が速くなるという理由から多用していたのですが、実は僕も嫌
いで必要以上に使わないようにしています。
確かに読みにくいですよね。
しかし MS のあるサンプルコードを参照した際に、こんな感じの記述がありました。

コード:

With あるコントロールのインスタンス
    .Name = "某"
    .Width = 830
    .Text = "某"
    .Alitn = Left
    .Font = さるコントロールのインスタンス.Font
End With




これはアリだと思うのです。
通常の制御文などで多用するのは大反対なのですが、このようにプロパティの定義
部分に限定して使うのなら、可読性もあがるし、タイプミスによるバグも回避でき
ます。

コード:

あるコントロールのインスタンス.Name = "某"
あるコントロールのインスタンス.Width = 830
さるコントロールのインスタンス.Text = "某"
あるコントロールのインスタンス.Alitn = Left
あるコントロールのインスタンス.Font = さるコントロールのインスタンス.Font




でも、 C# で使えないならどうしようもありませんが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-18 11:56
引用:

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

これはアリだと思うのです。
通常の制御文などで多用するのは大反対なのですが、このようにプロパティの定義
部分に限定して使うのなら、可読性もあがるし、タイプミスによるバグも回避でき
ます。


そうですね、こういう使い方ならば可読性が落ちることはないです。
タイプミスによるバグは、まあ、あんまりなさそうですが。

コード:

    With Me.TextBox1
        .Name  = "名前"
        .Width = 256
        .Text  = "テキスト"
        .Font  = Me.Font
    End With

コード:

    Me.TextBox1.Name  = "名前"
    Me.TextBox1.Width = 256
    Me.TextBox1.Text  = "テキスト"
    Me.TextBox1.Font  = Me.Font


それでも、CShaper だからかな?
私は後者の方がしっくり来てしまう。

でもコントロール系の初期化ってブロック分けされていた方が見やすいかもしれない。
これは、多分慣れの問題なんだと思います。(個人的に、なので)

引用:

でも、 C# で使えないならどうしようもありませんが。


もし、対応するならば Smalltalk のカスケードのようになるのかな?

コード:

    this.Controls.Add(this.textBox1) :
                  Add(this.textBox2) :
                  Add(this.textBox3) ;


それとも、VB の With ステートメントみたいになるのかな?
using などを踏襲するとこんな感じ?

コード:

    with (this.Controls) {
        .Add(this.textBox1);
        .Add(this.textBox2);
        .Add(this.textBox3);
    }


後者が Microsoft らしいかな? (^-^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-02-18 12:44
With は中途半端だと思うので、昔から使ったことはないです。
本来は使い捨ての一時変数でやったほうが良いと思います。
雰囲気としては、
コード:
temp = Me.あるコントロール
temp.Visible = False
temp.Text = "手当たり次第にC#に変換中!!"


みたいに。
ただ、こういう使い捨ての一時変数なのかそれとも、後でまた使うことがある変数なのかが分からないので、そういう目印を付けられるような言語仕様になっていたほうが良いなあと感じます。だからといって、スコープがあってどんどんインデントしていくのも耐えがたい。
また、一時変数の名前付けをどうしようか悩むのも嫌なので、anonymous で使える変数みたいなものがあるといいのでは。
要は手軽に一時変数を使いたいのだけど、スコープを気にしたり名前を気にしたり、型を意識したり、は、したくないのです。

コード:
○ = Me.あるコントロール
○.Visible = False
○.Text = "手当たり次第にC#に変換中!!"


みたいなのがいい?でもこれだと記号に変わっただけだなあ。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-02-18 14:03
引用:

じゃんぬねっとさんの書き込み (2006-02-18 11:56) より:

そうですね、こういう使い方ならば可読性が落ちることはないです。
タイプミスによるバグは、まあ、あんまりなさそうですが。

コード:

    With Me.TextBox1
        .Name  = "名前"
        .Width = 256
        .Text  = "テキスト"
        .Font  = Me.Font
    End With

コード:

    Me.TextBox1.Name  = "名前"
    Me.TextBox1.Width = 256
    Me.TextBox1.Text  = "テキスト"
    Me.TextBox1.Font  = Me.Font


それでも、CShaper だからかな?
私は後者の方がしっくり来てしまう。



うーむ、後者でも同じ文字列が並んでいることでブロックのように見えますね。
慣れの問題という意見に賛成です。

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

なので、

引用:

じゃんぬねっとさんの書き込み (2006-02-18 11:56) より:

もし、対応するならば Smalltalk のカスケードのようになるのかな?



に関しては、

コード:

    ParentProperty (this.TextBox1) {
        Name  = "名前"
        Width = 256
        Text  = "テキスト"
        Font  = Me.Font
    }



がいいです。

引用:

unibonさんの書き込み (2006-02-18 12:44) より:

本来は使い捨ての一時変数でやったほうが良いと思います。
雰囲気としては、
コード:
temp = Me.あるコントロール
temp.Visible = False
temp.Text = "手当たり次第にC#に変換中!!"



みたいに。



うーむ、僕が With を多用していた頃によく思ったのは、今の using のような
ことが一定のスコープ内でできればいいなーということでした。

コード:

    this.TextBox1.Name  = this.ファイルから読込む.名前の取得();
    this.TextBox1.Width = this.ファイルから読込む.幅の取得();
    this.TextBox1.Text  = this.ファイルから読込む.テキストの取得();
    this.TextBox1.Font  = this.ファイルから読込む.フォントの取得();

    {
        using t = this.TextBox1;
        using f = this.ファイルから読込む
        t.Name  = f.名前の取得();
        t.Width = f.幅の取得();
        t.text  = f.テキストの取得();
        t.Font  = f.フォントの取得();

    }




結局のところ一時的に変数に渡して書いている今とあまり変わらないのですが、
上記は変数に対する代入ではなく、キーワードの置き換えとして機能するのが
効率良いように思います。

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