×

Loading...
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。

因为主贴提到的一些限制,VB无法提供C#的一些很方便灵活的特性,比如

在C# 3.0中有一个很常见的对IEnumerable<T>进行操作的For Each Loop扩展函数,这个扩展函数基本在每一本教授LINQ的书中都被提到过,定义如下

public static void ForLoop<T>(this IEnumerable<T> s, Action<T> ac)
{
foreach (var x in s)
{
ac(x);
}
}
这个扩展函数的目的是为了简化一般的Loop循环操作,正常的写法是这个样子,比如我要打印string[]里面每一个字符的值,一般是这么写

string[] x;
foreach(var c in x)
{
Console.Write(c);
}

很烦人,如果利用上边的扩展函数,我可以这样写:
string[] x;
x.ForLoop(s=>Console.Write(s))

简单优美。

但是因为VB2008不支持匿名函数,我没法用相似的简单方法定义并且使用这个扩展函数(定义可以,但是没法使用)

当然VB2010作了重大改进,除了语法上保持极其啰嗦的特性之外,C#2008的功能它基本都支持了
Report

Replies, comments and Discussions:

  • 工作学习 / 学科技术讨论 / 不是我有偏见啊,VB.NET有的时候真的很Sucks,就拿C#里面及其常见的Action Delegate操作来举个例子
    本文发表在 rolia.net 枫下论坛比如,C#我有如下操作
    Action<string> a = s => Console.WriteLine(s);
    a("C# good");

    简单优美,再看看我用VB该怎么写,按理说应该这么写
    VB里面优美俺是想也不敢想的,只求尽量简单一些

    Module Module1

    Sub Main()
    Dim ac As Action(Of String)
    ac = Sub(x) Console.WriteLine(x)
    ac("VB SUCKS")
    End Sub

    End Module

    原以为很轻松的一种转换,居然没法通过编译,微软VB小组的人难道都是吃shit的?
    我只能把程序改成这个样子

    Sub Main()
    Dim ac As Action(Of String)
    ac = AddressOf Print
    ac("VB sucks")
    End Sub

    Sub Print(ByVal x As String)
    Console.WriteLine(x)
    End Sub

    也就是说,我没法用像在C#里面那样用一条语句完成对Action变量的赋值,而必须引用另外一个函数的名字,对于用惯了C#的程序员,这简直就是噩梦

    或者,我把程序改成这个样子,也可以
    Module Module1

    Sub Main()
    Dim ac As Action(Of String)
    ac = AddressOf Print
    ac("VB sucks")

    ac = Function(s) Print1(s)
    ac("VB sucks again")

    End Sub

    Sub Print(ByVal x As String)
    Console.WriteLine(x)
    End Sub

    Function Print1(ByVal x As String) As String
    Console.WriteLine(x)
    Return x
    End Function

    End Module

    看到没有,我用Function也可以,但是必须要返回个没有意义的数值。浪费资源,时间,感情,但关键是对事情本来意义的颠覆,Action的定义是不返回任何值的,但是在VB里面居然允许用Function来返回值,而且编译也不出错

    更糟糕的是,因为这些限制,有些在C#里面极其容易实现的功能在VB里面很难实现更多精彩文章及讨论,请光临枫下论坛 rolia.net
    • 一只大猫写这个贴子,总是等我回贴吧(我就自我感觉一下),老实说,大猫在这发的许多.NET贴子,大部分我都不会,所以我也从中学到很多东西,年龄大了,没那么精力,LINQ及Lambda不是我感兴趣的,回大猫的贴子都是现学现卖。
      Dim a As Action(Of String) = Sub(s) Console.WriteLine(s)
      a("C# stinks")
      • 这段代码在VB2008下不工作的,没办法,最近接手一个VB2008的项目,越做越生气,有感而发,写了主贴那段心得,其实还有一段,今天补上
    • 如果还是象很久以前,按程序行数计价的话,除了猫哥们,牛哥们,大多数程序员首选肯定还是vb
      • 给你推荐个网站,可以把你的C#程序转换成VB.NET,(对于.NET 3.0以后的东西可能转换后可能有些代码要稍作改动,.NET 3.0前是可以直接用的),看看代码行数有没有变长。
        • 行数有变化,c# 3217 lines => vb.net 2827 lines => c# 2914 lines. vb似乎还少点,在我看来,唯一的优点也没有了。
        • 这个网站用了很长时间了,我现在都是先写好C#在用这个网站转换到VB,呵呵,当然涉及到LINQ这些语法的,这个网站转换会出错,这些代码都是我手写
      • No. I would select DELPHI
    • 一只大猫对VB.NET的攻击简直到了污蔑的地步。
      Module Module1

      Sub Main()
      Dim ac As Action(Of String)
      ac = Sub(x) Console.WriteLine(x)
      ac("VB SUCKS")
      End Sub

      End Module

      原以为很轻松的一种转换,居然没法通过编译,微软VB小组的人难道都是吃shit的?

      评:大猫以走在技术前沿著名,就没在VS2010+.NET 4.0上试试?
      • Sorry啊,熬夜写的,忘了说一下环境了,测试环境是VB 2008。2010我测过,没问题,微软改正了这些Bug。其实说白了就是VB2008不支持匿名函数,这是一个很大的缺陷
      • 还有,惭愧啊,我真的没走在什么前沿,我说的这些都是.net 2.0时代就已经存在的基础。
        • 那你不如批评 Java 为什么不能像 F# 那样呢
          • 没用过Java,也不会。我只是原来猜想.net平台语言之间的一些重大优点应该由每种语言共享,比如你提到的 functional language 的风格,很遗憾,VB2008没有引入这个优点
        • 有时觉得你钻牛角尖里,.NET里定义无数具体的Delegate,我记不住,我也觉得无关紧要,用到就自己来啊。
          Module Module1

          Delegate Sub dePrint()

          Sub Main()
          Dim myD As New dePrint(AddressOf print)
          myD.Invoke()

          Console.ReadLine()

          End Sub


          Private Sub print()
          Console.WriteLine("fffffffff")
          End Sub
          End Module
    • MS 的东西都是垃圾
      • 这个世界上没有真正的垃圾,一切都是看怎么样的人去怎么使用
        • 说的对,所以用MS 的产品的人要么是马路天使,要么是环保人士
    • 我们VB.NET也有C#没有的关键字(With)
      With testObject
      .Height = 100
      .Text = "Hello, World"
      .ForeColor = System.Drawing.Color.Green
      .Font = New System.Drawing.Font(.Font, System.Drawing.FontStyle.Bold)
      End With
      • With is a long time and widely considered poor programming practice. It obscures the context of the code and reduces readability. It is a legacy from VB6.
    • 意义不一样吧。以前写 pascal 的时候,写完后整篇程序可以像一篇英语作文,直接从上往下人为可以读下来。我一直觉得VB也是维持那种风格的,但是你要求他们实现 functional language 的风格,就好象一定要用锤来使玉女剑法
    • VB程序员很多都是转行过来的,他们对语言没有太高的要求,搞得太复杂,他们未必接受。
    • 因为主贴提到的一些限制,VB无法提供C#的一些很方便灵活的特性,比如
      在C# 3.0中有一个很常见的对IEnumerable<T>进行操作的For Each Loop扩展函数,这个扩展函数基本在每一本教授LINQ的书中都被提到过,定义如下

      public static void ForLoop<T>(this IEnumerable<T> s, Action<T> ac)
      {
      foreach (var x in s)
      {
      ac(x);
      }
      }
      这个扩展函数的目的是为了简化一般的Loop循环操作,正常的写法是这个样子,比如我要打印string[]里面每一个字符的值,一般是这么写

      string[] x;
      foreach(var c in x)
      {
      Console.Write(c);
      }

      很烦人,如果利用上边的扩展函数,我可以这样写:
      string[] x;
      x.ForLoop(s=>Console.Write(s))

      简单优美。

      但是因为VB2008不支持匿名函数,我没法用相似的简单方法定义并且使用这个扩展函数(定义可以,但是没法使用)

      当然VB2010作了重大改进,除了语法上保持极其啰嗦的特性之外,C#2008的功能它基本都支持了
    • Bullshit! Did you ever try this Dim a As Action(Of String) = Sub(s) Console.WriteLine(s) a("Test")
      • 注意语言文明,发言前先把别人的贴子读完。