Что вы думаете о многострочных лямбдах в VB 10 - PullRequest
11 голосов
/ 30 октября 2008

Я только что смотрел видео на канале 9 MSDN, которое можно найти здесь , о некоторых новых функциях в 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 #, когда у вас использовать что-то вроде c => {....}, и вы можете вырезать много кода.

Каковы ваши многолинейные лямбды в VB?

Считаете ли вы их полезными и где?

Ответы [ 7 ]

14 голосов
/ 30 октября 2008

Лично я думаю, что синтаксис VB для делегатов и лямбд является полностью поддельным. Я имею в виду, давай, AddressOf! Это было хорошо в VB6. Это определенно не хорошо на языке, таком как VB.NET, где функции должны рассматриваться как первоклассные граждане (хотя на самом деле это не так, конечно) и где преобразование из Метод групп для делегатов более или менее прозрачен.

Теперь введение встроенных функций ужасно многословно. Я действительно считаю, что подход C # - x => f(x) будет очень хорошо работать в VB, потому что он точно показывает, что он делает. В текущем состоянии я предпочитаю C # для любой работы по функциональному программированию, что очень жаль, потому что я вообще предпочитаю VB.

Теперь я действительно рад, что VB наконец-то получает многострочные лямбды и операторные лямбды, потому что они иногда все еще полезны (например, Parallel.For). Но синтаксис перепутан. Кстати, то же самое относится и к итераторам (если они должны сделать это в VB10).

4 голосов
/ 04 ноября 2008

По предпочтению я разработчик на C #, но использую VB 9 почти исключительно уже около года. # 1 вещь в VB 9, которая разбивает мое сердце, это ограниченные лямбды. Лямбды в VB 9 ограничены следующими способами:

  • Только одно утверждение.
  • Они должны возвращать значение.

Таким образом, метод ForEach для коллекций не будет работать с лямбдами, и будут работать только самые простые операции. Так что большую часть времени вам приходится перемещать свою логику в какой-либо другой метод и использовать AddressOf. Много раз это нарушает читабельность кода драматическим и душераздирающим способом.

Это то, что многие, на мой взгляд, не поняли бы, если бы не использовали свободно анонимные методы на другом языке, который полностью их поддерживает (C #, JavaScript и т. Д.), А не искалеченной поддержке, которую они имеют в VB 9.

Я очень рад, что они исправляют лямбды в VB 10.

2 голосов
/ 23 октября 2010

То же самое здесь, я люблю VB. В большинстве случаев вы все время думаете и не пишете код, так что аргумент многословия, по моему мнению, терпит неудачу, поскольку вы обычно смотрите на код или редактируете его и представляете, сколько времени вы экономите, понимая свой код, когда читаете его в его коде. многословие в vb? Гораздо проще и меньше ошибок и ошибок, в отличие от C #.

Кроме того, c # по-прежнему не имеет с предложением, и vb имел это даже до .net дней.

With obj.class.methods

   .property = 1

   .attribute = 2

End with

Вообразите это с 10 вещами, которые должны быть установлены? В c # вам нужно создать ссылку на obj.class.methods и использовать ее для краткого выражения, что приводит к потере памяти и неэффективности, поэтому в этом отношении vb использует меньше памяти, и вы не будете наказаны за использование меньшего количества памяти в отличие от c #.

И аргумент «using» не работает, поскольку использование не работает с большинством объектов или объектов, которые не реализуют idisposable, что очень раздражает.

Затем подумайте обо всех явных приведениях, которые вы должны выполнять в c #, а не в vb. C # errs будет утверждать, что это способствует лучшему кодированию, но это бессмыслица, поскольку любому хорошему разработчику не нужно явно приводить что-то 500 раз в день, чтобы понять, что если бы он этого не делал, произойдет неявное приведение (как это происходит в VB).

Большинство c # errs используют его, потому что они исходят из ac фона, и это хорошо, но я считаю, что многие из них начали с него, потому что он содержит букву c, и они думают, что он круче, потому что ему не хватает языковой инновации, которую имеет vb что усложняет работу разработчика, и это заставляет их чувствовать себя умнее, круче и выше всех остальных - смеется, они не понимают, что скрыть сложность за 0 затрат - это конечная цель, которую может сделать для вас vb. Обратите внимание на часть с нулевой стоимостью, так как это было бы не очень хорошо, если бы цена была выше нуля.

2 голосов
/ 30 октября 2008

Я могу вспомнить две причины, почему я люблю это! Я слишком долго ждал этого.

Первый:

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

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

Второй:

 Private Sub SomeMethodRunningInAnotherThread()
     Me.Dispatcher.Invoke(Normal, Sub()
                                      'Do some other stuff '
                                      SomeTextBox.Text = "Test"
                                  End Sub)
 End Sub
0 голосов
/ 15 октября 2009

Нет простых способов справиться с этим:

Преобразование лямбды тела оператора C # в VB

без многострочной лямбды.

вздыхает

Так что да, я очень хочу, чтобы это было полностью освобождено.

-Adam

0 голосов
/ 30 октября 2008

Вам понадобится многострочный, как только мы получим библиотеку 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 равно числу доступных ядер.

0 голосов
/ 30 октября 2008

Полная поддержка анонимных методов в VB означает, что вы можете начать работать с более функциональным стилем. Если Sub () End Sub нужно идти по отдельным строкам ... это больно. Я надеюсь, что они разрешат однострочные анонимные методы, так что пока было только одно утверждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...