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

时间:2010-01-06 17:07:05

标签: c# java

对于正在开始学习Java的c#开发人员,这两种语言之间是否存在重大差异?

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

可能在OOP构造方面,GC的工作方式,引用,部署相关等等。

16 个答案:

答案 0 :(得分:115)

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

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

答案 1 :(得分:20)

答案 2 :(得分:17)

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

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

Java中还缺少一些简单但有用的东西,如逐字符串(@“”),运算符重载,使用yield和预处理器的迭代器在Java中也缺失。

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

答案 3 :(得分:10)

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

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

答案 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 Date类是可变的,它可以使返回和传递日期变得危险。
  • 不推荐使用大多数java.util.Date构造函数。简单地实例化日期非常详细。
  • 我从来没有让java.util.Date类与Web服务很好地互操作。在大多数情况下,任何一方的日期都被大致转变为其他日期和日期。时间。

此外,Java没有GAC和强名称程序集带来的所有功能。 Jar Hell是链接/引用外部库时可能出错的术语。

就包装/部署而言:

  • 将Web应用程序打包成实际安装并运行在多个不同应用程序服务器(Glassfish,Websphere等)中的EAR / WAR格式可能很困难。
  • 将您的Java应用程序部署为Windows服务需要比在C#中花费更多的精力。我得到的大部分建议涉及非免费的第三方图书馆
  • 应用程序配置并不像在项目中包含app.config文件那么容易。有一个java.util.Properties类,但它不够强大,找到正确的位置来删除你的.properties文件可能会让人困惑

答案 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上速度相当慢。