从C#转到Java

Jla*_*Jla 31 c# java

我已经使用C#和更普遍的.Net框架几年了.我经常听说C#和Java语言之间的相似之处,并希望了解更多有关第二种语言的信息.

  • 从C#开始学习Java有什么具体的建议吗?
  • C#程序员在启动Java时会遇到的任何常见错误?
  • 任何文档都显示了你可以保留的习惯以及你必须改变的习惯(仍然在C#中使用Java光学,所以比C#与Java比较更具体一些)?

Joe*_*oey 68

好吧,虽然C#和Java在表面上相似,但是有一些小的差异可能会让你感到困惑.一般来说,我认为从Java到C#的相反方向 - 问题较少.这主要是因为C#是一种更复杂的语言,因此您可能会发现许多来自常见Java模式的简化,但反过来可能会有点痛苦.

需要注意的事项(部分清单,不保证详尽无遗):

  • 不同......

    • 命名约定.在Java中,只有类型名称以大写字母开头(即PascalCase),其他所有内容都使用camelCase.但是,并不是很难坚持.

      接口通常也不是从一开始I.另一方面,您必须使用不同的关键字实现它们.但是,在代码中间并没有真正帮助.

    • 班级图书馆:-)

      虽然显而易见,但这是我在学习语言时花费的最多时间.在处理已知范例时,语法差异很快就会被整理出来,但在某些情况下,了解标准库/类库/框架需要一些时间:-)

    • 模式.嗯,不完全,它仍然是相同的东西.但是C#支持语言级别的一些模式,而你仍然需要在Java中自己实现它们.没有事件,但观察者模式(在Swing中非常普遍 - 每当你看到一个监听器,你知道该怎么做:-))
    • 异常处理.Java具有所谓的已检查异常,这意味着必须捕获或向上声明异常.通常这意味着你有

      catch (SomeException ex) {
        ex.printStackTrace();
      }
      
      Run Code Online (Sandbox Code Playgroud)

      经常在你的代码1 :-)

    • 类型.虽然.NET具有普通对象和值类型,但它们都是对象和支持方法,属性和c.Java有的二分法原始类型,例如int,float,char,& C.和,如String.没有多大关系,因为他们实现自动装箱,但有时它仍然恼人的包裹intInteger.
    • 多态性:所有Java方法都是virtual默认的,而c#方法则不是.
  • 轻微的句法差异.
    • foreach (a in b)for (a : b)
    • 不同的访问关键字 事情喜欢internalprotected internal不存在.但是不合格的成员对同一个包中的其他类是可见的(有点internal,但后来又不完全).
    • 字符串比较不是用==Java 完成的.你必须使用.equals().虽然在C#==中字符串是值相等,但在Java ==始终是引用相等.
  • 不......

    • 属性.在Java中,这通常是使用Foo getFoo()/ void setFoo(Foo foo)pattern在使用属性时静默生成的/ pattern,但是必须在Java中显式执行.通常,为了使语言本身更简单,Java中的许多东西都只是约定.不过,大部分时间你最好坚持他们:-)
    • 运算符重载.认为对正义程序员的危害是因为害怕被滥用而没有实施.不管怎样都不要经常使用它们,即使在C#中也没有,但有时它们很好,然后你就会遗漏一些东西.
    • 索引.您始终必须通过myList.get(5)而不是类似数组的语法来访问列表项myList[5].但是,这只是一个轻微的不便.
    • LINQ(虽然存在实现2,但它没有很好地集成),或lambda函数3(无论如何没有委托,但是匿名类),扩展方法或部分类(是的,在处理Swing时这是一个痛苦的,除非你'再次非常有纪律),以及一些更多的东西.
    • 多维数组.您可以使用锯齿状数组(数组数组),但不存在多维数据.
  • 泛型只是编译时,在运行时只剩下Object.当编译器抱怨?你的泛型中的所有四个具有不同类型时,泛型中的通配符有时很难解决.(虽然公平地说:那是我在运行时需要类型信息的情况,所以我又回到了Objects).

一般建议:抓住一位有Java经验的朋友,让他浏览你的代码.虽然他可能无法告诉你当你直接问他这个问题时你应该照顾的一切,他可以在代码中发现奇怪的事情然后通知你.这对我学习Java有很大帮助(虽然我先学习Java然后学习C#,所以它可能会有所不同).


1是的,我知道许多捕捉块看起来不同,但仍然,这可能是典型的,甚至不是那么罕见.
2 Quaere,JaQue,JaQu,Querydsl
3但是lambdaj.感谢你指出这一点,Esko.

  • @Ed:嗯,C#中的`==`仍然被重载为值相等.当然,如果不是两个操作数都是字符串那么那将是行不通的.但是,将字符串变量与文字字符串进行比较应该不会造成任何意外. (6认同)

BFr*_*ree 12

老实说,我认为许多试图学习Java的C#开发人员的最大障碍是学习新的IDE.Visual Studio很棒,当你在C#中编写很长一段时间时,你会习惯它.当不得不转移到Eclipse或Netbeans时,你会突然感到迷茫.我该如何设置断点?最近的窗口在哪里?如何创建Windows应用程序?等等...我知道这听起来很疯狂,但我告诉你,人们非常依赖他们的IDE并且很难适应新的......


Ant*_*lev 9

语言本身非常相似,没有几个关键字,Java缺少C#程序员习惯的属性(属性using,具体化(非类型擦除)泛型).

这里的主要问题是框架的知识,其中有数千个用于Java.

  • +1提及框架.Java语言非常紧凑(关键字数量多少?)但您可能需要学习的框架很大,有时很麻烦,例如J2EE (3认同)

Mr.*_*Boy 5

主要语言很好.了解库将是一件需要时间的事情.如果您正在进行Web应用程序,那么很多东西需要学习......与WCF和ASP.net等效的技术.你没有说你在哪个领域工作......桌面,服务器或网络服务器?

  • 这正是我要说的.作为一名学习C#的Java程序员,语言很容易(并且大部分都是相同的),它导航和学习库,而不得不习惯不同的IDE,这很难. (2认同)