学习Java的C#开发人员有什么可以忽略的最大差异?
对于渴望学习Java的c#开发人员来说,应该指出两种语言之间有什么大的根本区别?
也许有些人可能会认为是相同的,但有一些不容忽视的import方面呢? (或者你真的可以搞砸了!)
也许就OOP构造,GC工作方式,引用,部署相关等等而言
我的头顶上有几个问题:
- Java没有自定义的值types(结构),所以不要打扰他们
- Java枚举与C#的“命名数字”方法非常不同。 他们更OO。 如果你小心的话,它们可以用来产生很好的效果。
-
byte
是用Java签名的(不幸) - 在C#中,实例variables初始化器在基类构造函数之前运行; 在Java中,它们运行后 (即在“这个”类的构造函数体之前)
- 在C#方法默认密封。 在Java中,它们默认是虚拟的。
- C#中的默认访问修饰符始终是“当前上下文中可用的最严格的访问”; 在Java中它是“包”访问。 (值得一读在Java的特定访问修饰符。)
- Java和C#中的嵌套types的工作方式有所不同; 特别是它们有不同的访问限制,除非你声明嵌套types是
static
否则它将隐式引用包含类的实例。
这里是一个非常全面的比较2种语言:
http://www.25hoursaday.com/CsharpVsJava.html
新增: http : //en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
我很惊讶,没有人提到属性,这是C#中非常基本的东西,但在Java中没有。 C#3及以上版本也自动实现了属性。 在Java中,您必须使用GetX / SetXtypes的方法。
另一个明显的区别是C#3中的LINQ和lambdaexpression式在Java中不存在。
还有其他一些简单而有用的东西,比如逐string(@“”),运算符重载,使用yield和迭代器的Java在Java中都缺less。
我在C#中个人最喜欢的一个就是名称空间名称不必遵循物理目录结构。 我非常喜欢这种灵活性。
有很多的差异,但这些让我想起来:
- 在Java中没有运算符重载。 注意你的instance.Equals(instance2)与instance == instance2(特别是w / strings)。
- 习惯于不以前缀I作为接口。通常你会看到带有后缀Impl的命名空间或类。
- 由于Java内存模型,双重检查locking不起作用。
- 您可以导入静态方法而不用类名称作为前缀,这在某些情况下(DSL)非常有用。
- 在Java中切换语句不需要默认,并且不能使用string作为案例标签(IIRC)。
- Javagenerics会激怒你。 Javagenerics在运行时不存在(至less在1.5),它们是一个编译技巧,如果你想对generics进行reflection,会导致问题。
.NET已经泛化了generics; Java已经消除了generics。
不同之处在于:如果在.NET中有一个ArrayList<String>
对象,则可以在运行时告诉对象具有typesArrayList<String>
,而在Java中,在运行时,该对象的types为ArrayList
; String
部分丢失。 如果将非String
对象放入ArrayList
,则系统无法强制执行此操作,而在您尝试提取项目并且转换失败后,您只会了解它。
我从C#中错过的一件事是强制处理检查的exception。 在C#中,通常人们并不知道某个方法可能抛出的exception,而你却受到文档或testing的支配以发现它们。 Java中没有检查exception。
没有委托或事件 – 你必须使用接口。 幸运的是,你可以在线创build类和接口实现,所以这不是什么大不了的事情
Java对原语而不是值types进行自动装箱,所以尽pipeSystem.Int32[]
是C#中的一个值数组, Integer[]
是一个Integer
对象的引用数组,因此不适合更高性能的计算。
与System.DateTime相比,Java中的内置date/日历function是可怕的。 有很多这方面的信息: Javadate和时间API有什么问题?
其中一些可能是C#开发人员的陷阱:
- Javadate类是可变的,可以使返回和通过date危险。
- 大多数java.util.Date构造函数都被弃用。 简单地实例化date相当冗长。
- 我从来没有得到java.util.Date类与Web服务良好的互操作性。 在大多数情况下,任何一方的date都被疯狂地转换成其他date和时间。
另外,Java没有GAC和强名称程序集带来的所有function。 Jar Hell是链接/引用外部库时可能出错的术语。
就包装/部署而言:
- 将Web应用程序打包成实际安装并运行在几个不同的应用程序服务器(GlassFish,Websphere等)中的EAR / WAR格式是很困难的。
- 将您的Java应用程序部署为Windows服务需要比在C#中花费更多的精力。 我为此得到的大部分build议涉及非免费的第三方库
- 应用程序configuration并不像在项目中包含app.config文件那么简单。 有一个java.util.Properties类,但它不是健壮的,find放置.properties文件的正确位置可能会造成混淆
Java中没有委托。 因此,除了代表们带来的所有好处之外,事件的工作也是不同的。 而不是只是连接一个方法,你需要实现一个接口,并附上。
在我的面试列表中跳出一个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(); }
Java没有LINQ和文档是地狱。 在Java中的用户界面是一个痛苦的发展,你失去了微软给我们的所有好东西(WPF,WCF等),但得到很难使用,很难logging的“API”。
到目前为止,在处理来自C#的Java时遇到的一个问题是Exceptions和Errors是不同的。
例如,你不能使用catch捕获内存不足错误(Exception e)。
有关更多详情,请参阅以下内容
为什么-是Java的琅的OutOfMemoryError Java的堆空间-不抓
从Java开始就已经很长时间了,但是我注意到了应用程序开发中的一些东西:C#事件模型,C#拖放和使用Swing中的布局pipe理器(如果您正在执行App开发),以及exception处理Java确保你捕获一个exception,并不需要C#。
为了回应您在标题中的直接问题:
“学习Java的C#开发人员,可能会忽略的最大差异是什么?
答:Java在Windows上相当慢的事实。
当我切换到Java这是string声明时,最让我感到不舒服的区别。
在Java String
中的C# string
(大部分时间)
这很简单,但相信我,当你有习惯不S
时,会让你失去那么多时间!