c#和Java的主要区别是什么?

我只想澄清一件事。这不是哪个更好的问题,这部分我留给别人讨论。我不在乎。 我在工作面试时被问到过这个问题,我想多了解一点可能会有用

以下是我能想到的:

    Java是“平台独立的”。现在你可以说有莫诺项目,所以c#也可以考虑,但是 我认为这有点夸张。为什么?好吧,当一个新的Java版本完成时,它可以同时在它支持的所有平台上使用,另一方面,在Mono实现中还有多少c# 3.0的特性还没有实现呢?还是我们在这里应该比较的是CLR vs. JRE ?李< / >
  • Java不支持事件和委托。据我所知。
  • 在Java中,所有的方法都是虚的
  • 开发工具:我相信现在还没有Visual Studio这样的工具。特别是如果你使用过团队版本,你就会明白我的意思。

请补充其他你认为相关的。

< p >更新: 我突然想到,Java在类、方法等上没有自定义属性。真的是这样吗?< / p >
194865 次浏览

泛型:

使用Java泛型,您实际上无法获得. net所获得的任何执行效率,因为当您在Java中编译泛型类时,编译器会删除类型参数并在所有地方替换Object。例如,如果你有一个Foo<T>类,java编译器生成的字节码就像它是Foo<Object>一样。这意味着转换和装箱/开箱都必须在“后台”中完成。

我已经使用Java/ c#有一段时间了,在我看来,语言层面的主要区别是,如你所指出的,委托。

比较Java 7和c# 3

(这里没有提到Java 7的一些特性,但是所有版本的c#相对于Java 1-6的using语句优势已经被删除。)

并非所有的总结都是正确的:

  • 在Java中,方法是虚拟的默认情况下,但你可以将它们设为final。(在c#中,它们默认是密封的,但你可以将它们设为虚拟的。)
  • Java有很多ide,有免费的(如Eclipse、Netbeans),也有商业的(如IntelliJ IDEA)。

除此之外(以及你的总结中已经提到的内容):

  • 两者之间的泛型是完全不同的;Java泛型只是一个编译时的“技巧”(但是很有用)。在c#和。net中,泛型也在执行时维护,并且适用于值类型和引用类型,保持适当的效率(例如,List<byte>作为支持它的byte[],而不是盒装字节数组)。
  • c#没有受控异常
  • Java不允许创建用户定义的值类型
  • Java没有运算符和转换重载
  • Java没有用于简单实现迭代器的迭代器块
  • Java没有类似LINQ的东西
  • 部分由于没有委托,Java没有类似匿名方法和lambda表达式的东西。匿名内部类通常扮演这些角色,但是很笨拙。
  • Java没有表达式树
  • c#没有匿名的内部类
  • c#根本没有Java的内部类,事实上——c#中的所有嵌套类都像Java的静态嵌套类
  • Java没有静态类(静态类没有任何实例构造函数,不能用于变量、参数等)
  • Java没有任何等价于c# 3.0的匿名类型
  • Java没有隐式类型的局部变量
  • Java没有扩展方法
  • Java没有对象和集合初始化表达式
  • 访问修饰符有点不同——在Java中(目前)没有直接等价的程序集,所以没有“内部”可见性的概念;在c#中,没有与Java中的“默认”可见性相对应的,这考虑了命名空间(和继承)
  • Java和c#中的初始化顺序略有不同(c#在对基类型构造函数的链式调用之前执行变量初始化器)
  • Java没有属性作为语言的一部分;它们是get/set/is方法的约定
  • Java没有等同于“不安全”的代码
  • c#(和。net)中的互操作比Java的JNI更容易
  • Java和c#对枚举有不同的概念。Java更加面向对象。
  • Java没有预处理器指令(c#中的#define, #if等)。
  • Java没有类似c#的refout来通过引用传递参数
  • Java没有与部分类型等价的东西
  • c#接口不能声明字段
  • Java没有无符号整数类型
  • Java不支持十进制类型的语言。(java.math。BigDecimal提供了一些就像 System。十进制-有差异-但没有语言支持)
  • Java没有可空值类型的等价物
  • Java中的装箱使用预定义的(但“正常的”)引用类型,并对其进行特定操作。c#和。net中的装箱是一件更透明的事情,CLR为任何值类型的装箱创建了一个引用类型。

这不是详尽的,但它涵盖了我能想到的一切。

以下是Dare Obasanjo关于c#和Java之间差异的深度参考。在两者之间切换时,我总是会参考这篇文章。

http://www.25hoursaday.com/CsharpVsJava.html

c#具有自动属性,这非常方便,它们也有助于保持你的代码更简洁,至少当你的getter和setter中没有自定义逻辑时是这样。

另一个好的资源是http://www.javacamp.org/javavscsharp/ 本网站列举了许多例子,这些例子几乎说明了这两种编程语言之间的所有差异

关于属性,Java有注释,它的工作方式几乎相同。

c#在Java中没有的特性 c#包含了更多的基本类型和捕获算术异常的功能

•在Java上提供了大量方便的表示法,其中许多,例如操作符重载和用户定义的强制类型转换,对于大型c++程序员社区来说已经很熟悉了。

事件处理是“一等公民”——它是语言本身的一部分。

•允许定义“struct”,它类似于类,但可以在堆栈上分配(不像c#和Java中的类实例)。

c#实现属性作为语言语法的一部分。

c#允许switch语句操作字符串。

c#允许匿名方法提供闭包功能。

c#允许迭代器通过函数风格的yield关键字使用协同例程。

c#支持输出参数,帮助返回多个值,这是c++和SQL共享的特性。

c#具有别名命名空间的能力。

c#有“显式成员实现”,它允许一个类具体实现接口的方法,与它自己的类方法分开。这也允许它实现两个恰好具有相同名称的方法的不同接口。接口的方法不需要是公共的;它们只能通过该接口访问。

c#提供了与COM的集成。

•遵循C和c++的例子,c#允许通过引用调用原语和引用类型。

Java的特性在c#中不存在

Java的strictfp关键字保证了浮点运算的结果在不同平台上保持相同。

Java支持检查异常,以更好地执行错误捕获和处理。

请通过下面给出的链接 msdn.microsoft.com/en-us/library/ms836794.aspx 它涵盖了c#和java

之间的相似点和不同点