11

Visual Basic 10 のいくつかの新機能について、MSDN チャネル 9 でビデオを見ていました。このビデオは、ここにあり、Visual Basic 10 のいくつかの新機能について説明しています。 、私の目を引いたのは、C# のような複数行のラムダです。

ビデオでは、彼は次のような例を使用しました。

Dim scores = {10,20,30,40,50}
Dim thread as new Threading.Thread(Sub()
                                   For Each o in scores
                                     console.writeline(o)
                                     Next
                                   End Sub)

今、私はすべての冗長性においてVBが好きですが、sub...end sub inlineを書くと少し面倒になるのではないかと少し心配しています。 c => {....} のように、多くのコードを切り取ることができます。

VB での複数行のラムダについて、どのように考えていますか?

それらはどこで役立つと思いますか?

4

7 に答える 7

14

個人的には、VB のデリゲートとラムダの構文は完全に偽物だと思います。つまり、さあ、AddressOf!これはVB6では問題ありませんでした。VB.NET のように、関数を第一級市民として扱う必要があり (実際にはそうではありませんが)、メソッド グループからデリゲートへの変換が多かれ少なかれ透過的である言語では、これはまったく問題ありません。

現在、インライン関数の導入は恐ろしく冗長です。私は実際、C# のアプローチx => f(x)は VB でうまく機能すると信じています。現時点では、関数型プログラミングの作業には C# を好みます。これは残念なことですが、私は一般的に VB を好むからです。

今、VB が最終的に複数行のラムダとステートメントのラムダを取得したことを本当に嬉しく思いますParallel.For。しかし、構文がめちゃくちゃです。ちなみに、同じことがイテレータにも当てはまります(VB10にする必要がある場合)。

于 2008-10-30T07:48:39.473 に答える
4

好みにより、私は C# 開発者ですが、約 1 年間、ほぼ独占的に VB 9 を使用しています。VB 9 で最も心を痛めているのは、制限されたラムダです。VB 9 のラムダは、次のように制限されています。

  • 一言だけ。
  • 値を返す必要があります。

そのため、コレクションの ForEach メソッドはラムダでは機能せず、最も単純な操作のみが機能します。そのため、ほとんどの場合、ロジックを他のメソッドに移動して AddressOf を使用する必要があります。多くの場合、これはコードの可読性を劇的かつ悲痛な方法で切断します。

これは、匿名メソッドを VB 9 での不自由なサポートではなく、匿名メソッドを完全にサポートする別の言語 (C#、JavaScript など) で流暢に使用しない限り、多くの人が理解できないと思うものです。

彼らがVB 10でラムダを修正していることに非常に安心しています.

于 2008-11-04T16:51:03.850 に答える
2

ここでも同じです、私はvbが大好きです。ほとんどの場合、あなたは考えていて実際にコードを書いているわけではありません。私の意見では、冗長性の議論は失敗します。通常、コードを見つめたり編集したりしているためです。 vbの冗長性? C# とは対照的に、はるかに簡単で、エラーやバグが発生しにくい。

また、c# にはまだ with 句がなく、vb には .net の時代よりも前からこれがありました。

With obj.class.methods

   .property = 1

   .attribute = 2

End with

設定する必要がある 10 個の項目があると想像してみてください。C# では、obj.class.methods への参照を作成し、それを簡略表現に使用する必要があります。これは、メモリの浪費で非効率的です。 c# .

また、「using」キーワード引数は失敗します。これは、ほとんどのオブジェクトまたは idisposable を実装していないオブジェクトでは using が機能しないためです。これは非常に面倒です。

次に、vb ではなく c# で行う必要があるすべての明示的なキャストについて考えてみましょう。C#errs は、それがより良いコーディングを奨励すると主張しますが、それはナンセンスです。優れた開発者は、1 日に 500 回何かを明示的にキャストする必要がないため、暗黙のキャストが行われなければ ( vb)。

ほとんどの c#errs は、ac のバックグラウンドを持っているため、それを使用しますが、これは問題ありませんが、文字 c が含まれているため、多くの人が c から始めていることがわかります。開発者にとっては難しく、それは彼らをより賢く、よりクールに、そして他の誰よりも優れていると感じさせます-笑、彼らは複雑さを0コストで隠すことが最終的な目標であることを理解していません.vbがあなたのためにできることです. ゼロ コスト部分に注意してください。ゼロ コストを超えると良いことではないためです。

于 2010-10-23T17:53:30.387 に答える
2

頭のてっぺんから2つの理由を考えることができます。これを待ちすぎました。

初め:

 Private Sub SomeMethod()
     Dim SomeVariable as String = "Some text."

     AddHandler SomeButton.Click, Sub()
                                      SomeVariable += " Some more text"
                                      MessageBox.Show(SomeVariable)
                                  End Sub

2番:

 Private Sub SomeMethodRunningInAnotherThread()
     Me.Dispatcher.Invoke(Normal, Sub()
                                      'Do some other stuff '
                                      SomeTextBox.Text = "Test"
                                  End Sub)
 End Sub
于 2008-10-30T06:54:28.380 に答える
0

VB で匿名メソッドが完全にサポートされているということは、より機能的なスタイルを取り始めることができるということです。Sub() End Sub が別の行に移動する必要がある場合...それは痛いです。ステートメントが 1 つしかない限り、単一行の匿名メソッドが許可されることを願っています。

于 2008-10-30T05:05:44.917 に答える
0

ParallelFX ライブラリを取得したら、複数行が必要になります。

たとえば、このループを並列にしたいとします。

For i = 0 to 100
  '12 lines of code'
Next

並列バージョンは次のようになります。

Parallel.For( 0, 100, sub(i)
  '12 lines of code'
  End Sub )

ループの中身を新しいサブに変えることで機能します。その新しいサブは N 個のスレッドによって呼び出されます。N は通常、利用可能なコアの数です。

于 2008-10-30T06:14:02.127 に答える
0

これを管理する簡単な方法はありません。

C# ステートメント本体のラムダを VB に変換する

複数行のラムダなし。

はぁ

そうです、これが完全にリリースされることを切望しています。

-アダム

于 2009-10-14T20:21:23.227 に答える