对于正在开始学习Java的c#开发人员,这两种语言之间是否存在重大差异?
也许有些人可能认为事情是一样的,但是有一些不容忽视的导入方面? (或者你真的搞砸了!)
可能在OOP构造方面,GC的工作方式,引用,部署相关等等。
答案 0 :(得分:115)
一些问题摆脱了我的头脑:
byte
是用Java签署的(不幸的是)static
,否则它将具有对包含类的实例的隐式引用。答案 1 :(得分:20)
这是对两种语言的非常全面的比较:
http://www.25hoursaday.com/CsharpVsJava.html
已添加:http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
答案 2 :(得分:17)
我很惊讶没有人提到属性,这在C#中是非常基础的,但在Java中却没有。 C#3及以上版本也自动实现了属性。在Java中,您必须使用GetX / SetX类型方法。
另一个明显的区别是Java中缺少C#3中的LINQ和lambda表达式。
Java中还缺少一些简单但有用的东西,如逐字符串(@“”),运算符重载,使用yield和预处理器的迭代器在Java中也缺失。
我在C#中的个人最爱之一是命名空间名称不必遵循物理目录结构。我非常喜欢这种灵活性。
答案 3 :(得分:10)
有很多不同之处,但我想起了这些:
答案 4 :(得分:8)
.NET已经确定了泛型; Java已经删除了泛型。
区别在于:如果你有一个ArrayList<String>
对象,在.NET中,你可以告诉(在运行时)该对象具有类型ArrayList<String>
,而在Java中,在运行时,该对象属于ArrayList
; String
部分丢失了。如果您将非String
个对象放入ArrayList
,系统就无法强制执行该操作,并且在您尝试提取项目后,您只会知道它,并且转换失败。
答案 5 :(得分:6)
我在Java中从C#中遗漏的一件事是强制处理已检查的异常。在C#中,人们通常不会意识到方法可能会抛出的异常,并且您需要文档或测试来摆脱它们。在带有已检查异常的Java中不是这样。
答案 6 :(得分:5)
Java对基元而不是值类型进行自动装箱,因此尽管System.Int32[]
是C#中的值数组,但Integer[]
是对Integer
个对象的引用数组,因此不是适用于更高性能的计算。
答案 7 :(得分:4)
没有代表或事件 - 您必须使用接口。幸运的是,您可以内联创建类和接口实现,所以这不是什么大问题
答案 8 :(得分:2)
与System.DateTime相比,Java中的内置日期/日历功能非常糟糕。这里有很多关于此的信息:What's wrong with Java Date & Time API?
其中一些可能是C#开发人员的问题:
此外,Java没有GAC和强名称程序集带来的所有功能。 Jar Hell是链接/引用外部库时可能出错的术语。
就包装/部署而言:
答案 9 :(得分:1)
Java中没有委托。因此,除了代表们带来的所有好处之外,事件的工作方式也不同。不需要只是挂钩一个方法,你需要实现一个接口并改为附加它。
答案 10 :(得分:1)
在我的访谈列表中跳出b / c的一件事是,Java中没有用于方法隐藏的“新”关键字模拟,因此没有编译器警告“你应该把新的放在这里”。当您想要覆盖时意外隐藏的方法会导致错误。
(例如编辑) 例如,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();
}
答案 11 :(得分:1)
Java没有LINQ,文档很糟糕。 Java中的用户界面很难开发,你失去了微软给我们带来的所有好处(WPF,WCF等......),但是难以使用,很难记录“API”。
答案 12 :(得分:0)
到目前为止,在使用来自C#的Java时遇到的一个问题是异常和错误是不同的。
例如,使用catch(异常e)无法捕获内存不足错误。
有关详细信息,请参阅以下内容:
why-is-java-lang-outofmemoryerror-java-heap-space-not-caught
答案 13 :(得分:0)
我已经在Java工作了很长时间,但我在应用程序开发中注意到的事情就是C#事件模型,C#拖放vs使用Swing中的布局管理器(如果你正在做App开发),以及使用Java进行异常处理,确保捕获异常并且不需要C#。
答案 14 :(得分:0)
当我切换到java时,对我来说最难的是它的字符串声明。
在C#string
(大部分时间)
在Java String
这很简单,但相信我,当你有s
而不是S
的习惯时,它会让你失去那么多时间!
答案 15 :(得分:0)
回答你标题中的直接问题:
“C#开发人员学习Java,可能忽略的最大差异是什么?”
答:Java在Windows上速度相当慢。