C#开发人员学习Java,可能忽略的最大差异是什么?

mrb*_*lah 85 c# java

对于正在盯着学习Java的c#开发人员来说,应该指出两种语言之间存在哪些重大差异?

也许有些人可能认为事情是一样的,但是有一些不容忽视的导入方面?(或者你真的搞砸了!)

也许就OOP结构,GC的工作方式,引用,部署相关等而言.

Jon*_*eet 121

一些问题摆脱了我的头脑:

  • Java没有自定义值类型(结构),所以不要费心去寻找它们
  • Java枚举与C#的"命名数字"方法截然不同; 他们更多的是OO.如果你小心的话,它们可以起到很好的作用.
  • byte 用Java签名(不幸的是)
  • 在C#中,实例变量初始化器基类构造函数之前运行; 在Java中它们运行之后(即在"this"类中的构造函数体之前)
  • 在C#方法中默认是密封的.在Java中,默认情况下它们是虚拟的.
  • C#中的默认访问修饰符始终是"当前上下文中可用的最严格的访问"; 在Java中它是"包"访问.(值得阅读Java中的特定访问修饰符.)
  • Java和C#中的嵌套类型的工作方式有所不同; 特别是它们具有不同的访问限制,除非您声明嵌套类型,static否则它将具有对包含类的实例的隐式引用.

  • @cwap:在C#中,执行顺序是"实例变量初始值设定项,基类构造函数,构造函数体".在Java中,它是"超类构造函数,实例变量初始化器,构造函数体".(实例变量初始值设定项是在声明点为实例变量赋值时获得的.) (7认同)
  • +1对于初学者来说这是一个很好的列表. (5认同)
  • @Jon Skeet:+1,你可能会错过Lambda和LINQ直到Java 7? (3认同)

sof*_*eda 17

令我感到惊讶的是,没有人提到过属性,这在C#中是非常基础的,但在Java中却没有.C#3及以上版本也自动实现了属性.在Java中,您必须使用GetX/SetX类型方法.

另一个明显的区别是Java中缺少C#3中的LINQ和lambda表达式.

Java中缺少一些其他简单但有用的东西,如verbatim字符串(@""),运算符重载,使用yield和预处理器的迭代器在Java中也缺失.

我在C#中最喜欢的一个是命名空间名称不必遵循物理目录结构.我非常喜欢这种灵活性.


Sne*_*eal 10

有很多不同之处,但我想起了这些:

  • Java中缺少运算符重载.观察你的instance.Equals(instance2)与实例== instance2(特别是w/strings).
  • 习惯于不以I为前缀的接口.通常你会看到以Impl为后缀的命名空间或类.
  • 由于Java内存模型,双重检查锁定不起作用.
  • 您可以导入静态方法,而无需使用类名称作为前缀,这在某些情况下(DSL)非常有用.
  • Java中的switch语句不需要默认值,也不能将字符串用作案例标签(IIRC).
  • Java泛型会激怒你.Java泛型在运行时不存在(至少在1.5中),它们是一种编译器技巧,如果你想对泛型类型进行反射,会导致问题.

  • 最后我检查过,字符串没有重载==,我也没有听说过它是为Java 7添加的.但是,对于字符串连接,它们会超载+. (4认同)
  • 是的,将字符串与==进行比较对于新手而言是一个非常常见的陷阱.`.ququals`是你必须使用的. (3认同)
  • "Java中的switch语句不需要默认值" - C#也不需要. (2认同)

Chr*_*ung 8

.NET已经确定了泛型; Java已经删除了泛型.

区别在于:如果你有一个ArrayList<String>对象,在.NET中,你可以告诉(在运行时)对象有类型ArrayList<String>,而在Java中,在运行时,对象是类型ArrayList; 该String部分丢失.如果您将非String对象放入其中ArrayList,则系统无法强制执行该操作,并且在您尝试提取项目后,您只会知道它,并且转换失败.


Sea*_*ean 6

我在C#中错过的一件事是强制处理已检查的异常.在C#中,人们通常不会意识到方法可能会抛出的异常,并且您需要文档或测试来摆脱它们.在带有已检查异常的Java中不是这样.

  • FWIW,这是在 C# 的开发中考虑的,将它们排除在外的理由是真实的。考虑 http://www.artima.com/intv/handcuffs.html 。并不是设计者在哲学上反对检查异常——相反,他们正在等待一种更好的技术,提供类似的好处而没有所有毛茸茸的缺点。 (2认同)
  • 我喜欢C#没有检查异常的事实,但这是第一篇甚至指出差异的帖子,所以+1. (2认同)

Pet*_*ham 5

Java对基元而不是值类型进行自动装箱,因此尽管System.Int32[]是C#中的值数组,但它是对象Integer[]的引用数组,Integer因此不适合更高性能的计算.


归档时间:

查看次数:

17075 次

最近记录:

8 年,2 月 前