当前位置:  开发笔记 > 编程语言 > 正文

C#和Java有什么主要区别?

如何解决《C#和Java有什么主要区别?》经验,为你挑选了6个好方法。

我只想澄清一件事.这不是一个更好的问题,我要留给其他人讨论.我不在乎.在我的求职面试中,我被问到这个问题,我认为学习更多内容可能会有所帮助.

这些是我能想到的:

Java是"独立于平台的".那么现在你可以说有Mono项目,所以C#也可以考虑,但我相信它有点夸张.为什么?那么,当Java的新版本完成时,它同时可以在它支持的所有平台上使用,另一方面,Mono实现中仍然缺少多少C#3.0功能?或者我们应该在这里比较真正的CLR与JRE吗?

Java不支持事件和委托.我所知道的.

在Java中,所有方法都是虚拟的

开发工具:我相信还没有像Visual Studio这样的工具.特别是如果你使用团队版本,你就会知道我的意思.

请添加您认为相关的其他人.

更新:刚刚弹出我的想法,Java没有像类,方法等的自定义属性那样的东西.或者它呢?



1> Jon Skeet..:

比较Java 7和C#3

(这里没有提到Java 7的一些功能,但是using已经删除了所有版本的C#而不是Java 1-6 的语句优势.)

并非所有摘要都是正确的:

在Java中,默认情况下方法是虚拟的,但您可以将它们设为最终方 (在C#中,它们默认是密封的,但你可以将它们设置为虚拟.)

Java有很多IDE,包括免费(例如Eclipse,Netbeans)和商业(例如IntelliJ IDEA)

除此之外(以及您的摘要中已有的内容):

仿制药在两者之间完全不同; Java泛型只是一个编译时的"技巧"(但是很有用).在C#和.NET中,泛型也在执行时维护,并且对值类型和引用类型起作用,保持适当的效率(例如,List作为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 /是方法的约定

Java没有相当于"不安全"的代码

Interop在C#(和一般的.NET)中比Java的JNI更容易

Java和C#对枚举有一些不同的看法.Java更加面向对象.

Java没有预处理器指令(C#中的#define,#if等).

Java没有C#的等价物,refout不能通过引用传递参数

Java没有等效的部分类型

C#接口不能声明字段

Java没有无符号整数类型

Java没有十进制类型的语言支持.(java.math.BigDecimal提供类似 System.Decimal的东西- 有差异 - 但是没有语言支持)

Java没有等价的可空值类型

Java中的Boxing使用预定义(但"正常")引用类型,并对它们进行特定操作.C#和.NET中的拳击是一个更透明的事情,CLR为任何值类型创建了用于装箱的引用类型.

这并非详尽无遗,但它涵盖了我能想到的一切.


@Brian:我认为Java泛型和内部类的细节很快就会破坏Java通过简单实现优势的想法;)
@OrangeDog:此外,你声称"能够做更多的事情会增加你做错的可能性"也是一个谬论的IMO ......因为它假设如果你不能使用一个特征做一些事情语言让它变得简单,你根本不需要这样做.这简直是​​不真实的 - 通常你需要在Java和C#中完成的任务是相同的,但由于缺少功能,Java使得更难以正确地完成这些任务.通过简化任务,功能*减少了你做错的可能性.
@OrangeDog:出于兴趣,你是多么公正?是的,我是C#爱好者,但也有非常重要的Java经验 - 毕竟这是我的日常工作.这并不像我对如何有效地使用Java一无所知.
@OrangeDog:IMO认为,人们主要是在开玩笑.很难看出如何强制编写显式的try/finally块比使用IMO语句更不容易出错.与Java相比,大多数C#的"额外"功能意味着您可以减少编写代码,并且该代码可以更具可读性.
@OrangeDog:首先,据我所知,大多数开发人员不使用"不安全"编写代码,因此这是一个红色的鲱鱼.我也认为可证明性是一个红色的鲱鱼 - 我认为正式的可证明性与人类*推理代码的容易程度有很大关系.我的观点是,作为一个在Java和C#方面都很有经验的人,我发现C#在生产力和可读性方面是一种非常优越的语言.如果您有相反的想法,您能否澄清两种语言的经验水平?我认为这与讨论非常相关.
@Jon Skeet - 没有冒犯,但你并不完全公正.根据我的经验,拥有一年Java经验的人会比拥有一年C#经验的人编写更好的代码.
@OrangeDog:但我看到Java代码中存在大量漏洞.有多少人在使用这些打样工具?实际上我相信它只是一小部分用户.请注意,大多数语言功能只能在不使用lambda表达式的情况下在C#中更长时间地编写.因此,您可以考虑使用更复杂形式的校对工具,方法是对更简单的形式进行翻译并在其上运行校对.(在公正性方面,请记住我不为微软工作......是的,我认识一些C#团队,但我对C#批评也毫无限制.)
@OrangeDog:...比如创建一个新线程并调用thread.Sleep(1000) - 这使得*看起来*就像你告诉新线程要睡觉一样,但实际上它是当前要休眠的线程.你不能用C#做到这一点.不知道自己在做什么的人会用这两种语言搞砸.显然有两种语言的问题 - 但我的经验(听起来比你的更平衡,两种语言都有*几年*)是C#中的陷阱几乎都很容易找到并修复,而且*很容易*通过生产力的好处弥补.
当你看到这样的拼写时,我突然更好地理解为什么我有这种感觉,Java不如C#.
@jpartogi:嗯,Java 7至少应该帮助解决其中的一些问题.生活中不仅仅是生活中的新事物.话虽如此,我仍然更喜欢C#到Java :)
@OrangeDog:嗯,部分*是关于它是否被使用.Java有很多不起眼的领域,尤其是泛型.事实上,*很容易判断一个特定的C#项目是否在任何地方都使用不安全的东西:你看看项目设置.默认情况下,您*不能*使用不安全的代码...您必须告诉编译器让您这样做.而且你并不只是建议更多的功能提供更多的机会来犯错误 - 你说:"有人认为这会让Java变得更好",暗示你(IMO)就是那些人之一.
@OrangeDog:1)我还将自己列为Google的工程师.正如我已经说过的,我主要在日常工作中使用Java.如果我已经广泛地尝试了两种语言并且更喜欢C#,那是否会让我*偏向*必然?或者它可能只是语言之间差异的结果?2)可推广性对于您的语言评估至关重要?哇.3)通过引用调用静态方法会在某些IDE中生成警告,但不会在javac中生成警告(即使使用-Xlint).顺便说一句,我可能会找到你的Eclipse功能请求*我建议*将其作为警告.(继续)
4)不,我的观点是"你可以无意中链接到使用不安全代码的DLL","你可以无意中链接到使用JNI的jar文件".5)在语言术语中(我认为应该在我们谈论语言时使用),操作符被重载,而不是被覆盖.行为因操作数类型而异.我怀疑我们超出了这个讨论真正有用的地步......我坚持认为C#的新功能可以更容易地编写正确的代码.如果你不同意,那就这样吧.我怀疑我们任何一个人都会说服对方.
@JesperE:不,枚举类不像C#中的静态类.您仍然可以将枚举作为参数传递,将它们用作变量,在Java中定义实例mtehods等.在C#中,静态类**基本上只用于实用程序方法.(类中可以有静态,但没有实例状态)
@OrangeDog:如果你只是这么说,那就没事了.但不,你从可证明性和各种其他事情开始.顺便说一下,你仍然没有回答我关于你有多少C#体验的问题.
@OrangeDog:虽然我发现这是一个非常好的方式,让更有经验的开发人员辅导那些经验不足的人,好好利用这门语言.经验各不相同......但我仍然希望从C#代码库中看到更少的错误*整体*,因为像使用语句这样的东西比try/finally块更简单,等等.哦,Java泛型给了一个额外的可以考虑蠕虫...
@Jon Skeet - 我认为我们现在应该停止,因为代码审查的优点与更多功能是否使语言"更好"相距甚远,这本身远离页面顶部的实际问题.
@R Bemrose:在Java中,如果要使类不可实现,则必须显式声明私有构造函数.这并不能阻止您在类中创建实例.它也不会阻止人们尝试将类型用于变量等.静态类信号*intent*.
"Java没有匿名类型".不对.为了拥有匿名内部类,匿名类型是必须的.话虽如此,要使匿名类型真正有用,您需要类型推断.C#有这个,Java没有.
@Jon Skeet - 两者都没有使用lambdas来解决C#的可证明性问题.至少你也可以完全从语言中删除`unsafe`.任何行为未定义的语法构造实际上都会在工作中抛出一个扳手.我猜你也必须删除大多数Java没有的东西.
@OrangeDog:不,你不仅仅说"更多功能=更好"的假设是错误的:你声称"能够做更多的事情会增加你做错的可能性." 那不是一回事.然后你质疑我的公正性,提出了可证明性以及我坦率地认为是FUD的各种其他方面.如果您要使用不安全的代码包含链接到DLL,您最好还包括调用使用JNI的Java.你忽略了Java中可能出现的bug而不是C# - 比如通过引用调用静态方法(续)
4)"动态链接"是指JNI vs P/Invoke?如果是这样,那完全取决于你在做什么.我几乎没有在C#中使用它.5)运算符重载对"."没有太大作用.(虽然扩展方法有).当谈到陷阱和运算符重载时,您是否注意到Java中最大的问题之一是人们将字符串与==进行比较?事实证明,拥有可用的东西真是太好了......虽然显然你需要知道发生了什么才能有效地使用这种语言.我将其视为*any*语言的给定.
Java无法切换字符串
@CrazyJugglerDrummer - 有人认为这会让Java变得更好.能够做更多的事情会增加你做错的可能性.
@Jon Skeet - 我与Sun,Oracle或任何Java语言设计师没有任何关系.我喜欢C#的lambda,不幸的是由于其他语言功能的复杂性,你无法形成任何关于它们的证据.Java更简单,更一致的语义导致更强大的证明程序是正确的.
@Jon Skeet - 1)您将自己列为主要C#书和Microsoft MVP的作者.因此,人们会认为你偏向于C#.2)你认为FUD我认为对语言的评估至关重要 - 它的语义含义.3)静态方法通过引用生成编译警告,因此这不是一个主要问题.4)动态链接在Java中很少见,但在C#中更为常见.5)如果你想要混淆机会,运算符重载是最重要的.使用Java,您总是知道`.`将要做什么,而无需检查库文档.
@OrangeDog :(续)同样,任何熟悉两种语言的人都不太可能遇到问题.我注意到你仍然没有回应我的主要观点,如果你试图用两种语言完成相同的任务,C#的额外功能通常可以帮助你用更少的代码完成,*减少*犯错误的可能性而不是增加它.这是对你原来观点的反驳,"能够做更多的事情会增加你做错的可能性." 你还在努力保持这种说法吗?

2> Winston Smit..:

以下是Dare Obasanjo对C#和Java之间差异的深入参考.在两者之间切换时,我总是发现自己指的是这篇文章.

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


@Winston:我们需要一个"Chuck Norris和Jon Skeet之间的差异"清单:*1)Chuck Norris总是有时间; Jon必须修改`TimeDate`类才能总是有时间,还没有时间:(*
羞耻尚未更新C#3 :(
@Jon Skeet:你是最活跃的C#开发者.为什么不维护您的C#和Java差异版本.我打赌人们会喜欢读它.

3> Morten Chris..:

C#具有非常方便的自动属性,它们还有助于保持代码清洁,至少在getter和setter中没有自定义逻辑时.



4> 小智..:

Java中缺少C#的特性•C#包含更多原始类型和捕获算术异常的功能.

•包含大量基于Java的符号方便,其中许多(例如运算符重载和用户定义的转换)已经为大型C++程序员社区所熟悉.

•事件处理是"一等公民" - 这是语言本身的一部分.

•允许定义"结构",它类似于类,但可以在堆栈上分配(与C#和Java中的类实例不同).

•C#将属性作为语言语法的一部分.

•C#允许switch语句对字符串进行操作.

•C#允许匿名方法提供闭包功能.

•C#允许通过函数式yield关键字使用协同例程的迭代器.

•C#支持输出参数,有助于返回多个值,C++和SQL共享的功能.

•C#具有别名空间的功能.

•C#具有"显式成员实现",它允许类专门实现接口的方法,与其自己的类方法分开.这允许它还实现两个碰巧具有相同名称的方法的不同接口.接口的方法不需要公开; 它们只能通过该界面访问.

•C#提供与COM的集成.

•遵循C和C++的示例,C#允许通过引用调用原始类型和引用类型.

C#中缺少Java的功能

•Java的strictfp关键字保证浮点运算的结果在不同平台上保持不变.

•Java支持已检查的异常,以便更好地实施错误捕获和处理.



5> Rafael Romão..:

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

关于属性,Java具有注释,其工作方式几乎相同.



6> bruno conde..:

泛型:

使用Java泛型,实际上并没有获得.NET所带来的任何执行效率,因为当您在Java中编译泛型类时,编译器会删除type参数并在任何地方替换Object.例如,如果你有一个Foo类,那么java编译器会生成字节代码,就像它一样Foo.这意味着必须在"背景"中进行转换以及装箱/拆箱.

我已经玩了一段时间的Java/C#,在我看来,语言层面的主要区别在于,如你所指出的那样,代表们.


不,布鲁诺对性能差异是正确的.在Java中无法获得List (通常)的等价物.你必须有一个List ,这将导致拳击惩罚(时间和记忆).
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有