Java 7以后的哪些功能必须鼓励从C#切换?

NT_*_*NT_ 24 c# java language-features programming-languages

C#目前势头良好.为了切换(或返回)到Java ,您需要具备哪些功能?

如果人们为当前的Java版本发布了这些的变通方法,例如Nullables被自定义类包装,那么这将是非常有用的,以使这个更有趣的wiki.

Nat*_*ate 33

作为.NET/C#开发人员,这里缺少让我烦恼的功能.这个列表没有特别的顺序 - 正如想到的想法:

  1. Java库太小了.对于常见的事情,我必须在5种竞争的开源产品中进行选择,因为基础库缺乏很多方面.
  2. 这是一种面向对象的编程语言吧?为什么原始类型不能从"对象"继承?
  3. 指针
  4. Lambda表达式
  5. 关闭
  6. 部分类和较小程度的部分方法
  7. 对泛型的真正支持
  8. 使用语句和Dispose - 对我来说这是一个真正的WTF.您必须在try/catch块中显式关闭连接.可怜的Java家伙!
  9. 收益率会很好
  10. 无符号整数 - 再次WTF?为了什么目的,我必须使用比我需要的更大的数字类型?
  11. 在Java中,您可以从try/catch的最后一个块返回.一位同事通过这种方式引入了一个错误,让我困惑了几个小时.应该像在C#中一样禁止这种行为.

我很少使用Java,当我这么做时,我会有各种各样的WTF时刻.

编辑:我删除了每个评论基于它自1.5以来不再缺少Java功能的事实.

  • Java库太_small_?这对我来说是新闻:) (20认同)
  • 请不要将指针混合到我的更高级语言中. (10认同)
  • 你介意解释12吗?我没有做过任何关于C#的重要事项,但它与Java(对象:集合)的不同之处是什么? (7认同)
  • 确实,Java有一些缺点.但是,与第一个实施该语言的人相比,从某人的错误(C#)中学习的人总是更容易.老实说,C#是Java到.NET的一个端口.我们可以谈谈Visual Basic是多么疯狂. (7认同)
  • 马老师告诉我,指针是baaad;) (3认同)
  • 我认为缺少值类型和属性应该在此列表中.你说什么? (2认同)
  • Piligrin:这就是为什么你将它们的用法包装在`baaad {}`块中,呃,我的意思是'不安全{}`块 (2认同)
  • 拥有竞争的开源库来解决问题是一个很大的优势! (2认同)
  • @Richard - 我会说C#是对Java的响应,而不是Java的端口.在很多方面,C#都使用了很多不同的语言.我不认为这是一件坏事.从技术角度来看,我认为C#现在是功能上相当领先的Java,而不是相反,它结合了动态语言中越来越多的功能.Java也正在变形,但从局外人的角度来看,它比C#更慢. (2认同)
  • "请不要将指针混合到我的高级语言中." --->(续:所以我永远不能用简单的方法做低级别的东西,而是使用JNI或其他一些发明来读写一个简单的位图.)<---指针在C#中没有被过度使用(实际上它们是由于它们只能在不安全的块中使用,因此它们只能在不安全的块中使用,并且需要使用编译器开关来启用不安全的块,并且存在更多限制:它们不能是类的字段等,Java也可以这样做. (2认同)

jsi*_*ght 20

根据我的经验,Java vs. .Net更像是商业决策,而不是技术决策.拥有MS经验的商店趋向于.Net和拥有Java体验趋势的Java和OSS商店.我看到很少有人根据语言特征进行切换.另一方面,我看到商店大量倾向于一个或两个关键员工的平台b/c,他们想雇用他们在该领域知识渊博.

  • 我从事.NET项目,仍然使用大量的OSS.我不认为它应该只附加到java方面. (13认同)
  • 明确确定.NET无法使用的单一功能是我们不在Windows上部署. (2认同)

Bli*_*ndy 16

没有特别的顺序:

  • 函数指针(委托); 事物的整个传递界面是愚蠢的
  • 真正的仿制药 ; 如果编译器甚至无法通过单元的编译来保存元数据,那么具有类型安全泛型的重点是什么?
  • 你的速度 ; 与包含在"托管"库中的本机控件相比,所有自绘ui库都非常慢,更不用说微软的自绘ui是通过direct3d硬件加速的
  • 一个yield return构建体 ; c#是如此用户友好,这很疯狂
  • 运算符重载
  • linq ; 只是因为它如此上瘾
  • 属性 ; 你上瘾的更多的synctatic糖
  • 更好地与本机代码互操作 ; 与jni -.-相比,c#的p/invoke和本地com支持使interop变得如此简单
  • 第一类价值类型 ; 这与真正的泛型相辅相成,拥有通用列表从不在c#中装箱/取消装箱是c#为什么比java快的部分原因.

我会说这是最重要的一个:

  • 响应迅速,信息量大的调试器 ; 现在甚至没有任何东西可以接近视觉工作室

  • 关于调试器和视觉工作室一般 - 尝试IntelliJ Idea(它现在是开源),与这个程序相比,VS只是一个花哨的记事本.我同意自绘UI很慢,但它是跨平台开发的最佳解决方案. (4认同)
  • @Piligrim:你真的想说.NET/C#调试器已经过时了吗?你用过吗? (4认同)

Mat*_*ttC 13

刚刚离开袖口,我认为Java 7需要的最大的事情是每个人都感到遗憾的是缺少封闭.

  • 为我们现有的代码库添加闭包将比仅重写一切只是为了利用一种语言功能要好得多. (4认同)

Kon*_*man 13

我是一名C#程序员,大约一年前我不得不参与Java应用程序的开发.我最想念的是:

  • Visual Studio(Eclipse很好,但VS是VS,尤其是Team Edition)
  • 将字符串与==进行比较
  • 属性
  • 作为第一类对象的基本类型(例如,不是"int"类型vs"Integer"类)
  • 匿名方法(可以使用匿名类进行解决方法,但不一样)
  • LINQ

当我回到C#时,我错过了一个单独的Java功能:方法签名中的显式异常声明.

免责声明:我说的是一个有点旧项目,我不知道当前版本的Java中是否存在其中一些功能.

  • .NET方式的关键在于您不必记录异常.抛出的所有异常都是出乎意料的.我并不是说它比Java更好或更糟,只是在正确使用时它才有意义. (2认同)

Mat*_*all 11

减少令人发指的XML解析和操作工具.在Java中用XML做任何事都很糟糕.

  • 从什么时候开始,JSON很容易用Java生成? (4认同)
  • 唉唉.如此真实!如果可以,请改用JSON. (3认同)

Joh*_*mez 10

我也会反过来给出一个答案.C#需要像Java一样的枚举实现.Java的枚举摇滚!

我也可以在此列表中添加匿名覆盖.很抱歉离开主题,但C#需要能够匿名覆盖方法.我一直在Java和C#之间来回切换,我不得不说对单元测试遗留代码,没有比匿名类重写更好的了.

  • Java中的枚举类允许您拥有方法并像处理任何其他类一样对待它.这对于为枚举提供功能非常有用.它也是一个非常简单的单身人士. (3认同)
  • C#枚举是完全类型安全的基类型,Java枚举完整的fledges类,带有一个很好的`const`预设语法.C#的枚举将更加高效,因为它们完全基于价值. (2认同)

Joh*_*mez 9

我需要某种函数指针.在C#中使用委托的能力非常有用.在Java中有很多次我想创建一个委托或函数指针的映射作为解决方案,但我不能.我知道你可以在Java中模拟类似的东西,但将抽象作为语言的一部分是一个巨大的优势!

  • 匿名委托和lambdas会很棒 - 像"s => s + s"这样的匿名类如"new Delegate(){public void Invoke(String s){return s + s;}}"是不可用的. (4认同)
  • 我不认为它需要函数指针.它(大多数情况下)需要的是没有所有样板的当前语义. (2认同)

Mik*_*Two 9

动量.我在两个平台上都做了很多开发.由于C#语言的发展方式,我更喜欢.NET方面.Java的演变似乎更像是对C#的反应,而不是对实际愿景的反应.所以我认为Java要做的最好的事情就是忽略.NET并创建自己的新东西.

  • @ _NT - 同意它以这种方式开始,但C#似乎在进化速度方面处于领先地位.首先是泛型和属性只是为了命名2.因此我认为它更多地位于驾驶员座位上.C#现在受到许多其他语言和编程范例的影响,例如函数式编程和动态语言.这些影响不再来自Java了.在C#的初始发布之后,我无法想到Java在C#之前添加的功能.但当然,C#的核心部分是从Java启发(甚至复制). (2认同)

Joh*_*mez 8

另一个我想要的是一些等同于LINQ.当我尝试进行顶级编码器竞争并意识到它们只支持.NET 2.0时,我注意到我实际上依赖于使用LINQ的能力.一旦习惯使用LINQ解决问题并使其成为常规编程词汇表的一部分,就很难从根本上看不出问题.它类似于使用泛型,然后无法使用泛型.


Van*_*nya 7

我认为,Java和C#之间的选择不是语言特征的问题,而是平台和生态系统选择的问题.

所以,我怀疑Java或C#中的任何新的语法糖都会导致平台之间的大量切换器.

毕竟,JVM世界有Scala,许多语言敏感的开发人员正在以某种方式使用它.


fol*_*one 5

我认为,你应该考虑将这个神圣战争从"Java vs C#"转换为"JVM vs CLR",因为JVM(在过去几年 - 主要是)不仅是Java,还有Scala,Groovy,Clojure,JRuby,Jython和十几种JVM语言.