对于渴望学习Java的C#开发人员,应该指出这两种语言之间是否存在巨大的根本差异?
也许有些人可能会认为事情是相同的,但是有些重要的方面不容忽视?(或者您真的可以搞砸!)
也许就OOP构造,GC的工作方式,参考,与部署相关的方面而言,等等。
对于渴望学习Java的C#开发人员,应该指出这两种语言之间是否存在巨大的根本差异?
也许有些人可能会认为事情是相同的,但是有些重要的方面不容忽视?(或者您真的可以搞砸!)
也许就OOP构造,GC的工作方式,参考,与部署相关的方面而言,等等。
Answers:
我头上有些毛病:
byte 是用Java签名的(不幸的是)static它将对包含类的实例进行隐式引用。有很多区别,但是这些对我来说很明显:
.equals是您必须使用的。
.NET已对泛型进行了改进;Java删除了泛型。
区别是:如果ArrayList<String>在.NET中有一个对象,则可以(在运行时)告诉该对象具有类型ArrayList<String>,而在Java中,在运行时,该对象是类型ArrayList;该String部分丢失。如果您将非String对象放入ArrayList,系统将无法强制执行该操作,并且只有在您尝试将项目提取出来之后,您才会知道它,并且强制转换失败。
String对象在该列表中未做一个未经检查的演员,某个地方,编译器会正确地警告你,在这一点上,编译器不能检查的一般界限。只要您的列表始终存储在的变量中List<String>,尝试将非String对象插入其中的尝试就不会编译。
add方法(同样,通过反射)。系统会立即拒绝非String对象还是仅在强制转换结果时拒绝get?
List。您可以使用类型从降序的对象List,例如ArrayList和LinkedList。(重要的是使用List而不是ArrayList在传递它们时,但这不会改变您不能说的事实new List()。)
我在Java中用C#错过的一件事是强制处理检查的异常。在C#中,人们通常不知道方法可能会引发的异常,而您只能依靠文档或测试来发现它们,这是很常见的。在带有检查异常的Java中不是这样。
Java具有针对原语而非值类型的自动装箱,因此尽管 System.Int32[]C#中的值Integer[]是数组,但是Integer对象的引用数组,因此不适合更高性能的计算。
与System.DateTime相比,Java中的内置日期/日历功能令人震惊。这里有很多有关此的信息: Java Date&Time API有什么问题?
对于C#开发人员来说,其中一些可能是陷阱:
另外,Java不具有GAC和强命名程序集所具有的所有相同功能。 地狱惊魂是链接/引用外部库时可能出问题的术语。
就包装/部署而言:
在我的采访清单上,有一个b / c跳出来的问题是,Java中没有用于方法隐藏的“ new”关键字类似物,也没有编译器警告“您应该在这里放新的”。当您打算重写时,意外的方法隐藏会导致错误。
(例如,编辑)例如,B从A派生(使用C#语法,Java的行为与我上次检查时相同,但不发出编译器警告)。是A的foo被调用,还是B的foo?(A被称为,可能使实现B的开发人员感到惊讶)。
class A
{
public void foo() {code}
}
class B:A
{
public void foo() {code}
}
void SomeMethod()
{
A a = new B(); // variable's type is declared as A, but assigned to an object of B.
a.foo();
}
new有意隐藏的方法-或非最终的因此被替代而不是隐藏。
到目前为止,在使用来自C#的Java时遇到的一个问题是“异常”和“错误”是不同的。
例如,您不能使用catch(Exception e)捕获内存不足错误。
有关更多详细信息,请参见以下内容:
回答标题中非常直接的问题:
“学习Java的C#开发人员,最大的区别是什么?”
答:Java在Windows上的运行速度相当慢。