C#就是Java只不过差了一点点

2024-03-17 05:38

本文主要是介绍C#就是Java只不过差了一点点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C#和Java都是很不错的语言。他们通过类似的方式达到了类似的目的,尽管C#比Java多出来一些和句法相关的东西,例如foreach关键字和一些更加让人高兴的扩展/实现架构。不幸的是,这些改进的光芒被削弱的东西掩盖掉了。在本文里,我将比较两种语言,并尽量避免深入到JVM和CLR层。

<script language="JavaScript1" src="http://ad.cn.doubleclick.net/adj/messagingplus.zdnet.com.cn/developer/tech;sz=1x1;ord=858014683?"> </script> <script language="VBScript"> on error resume next ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.5"))) </script>  

Java:无可争辩地具有C++所有的精华
在比较Java和C#的时候,你不可能不注意到它们诸多的相似之处,这在某种程度上要归结于它们共同的来源:C和C++。但是,当Gosling和他的同事们坐下来创造Java的时候,他们不仅吸取了C++的能力,而且更重要的是,他们减掉了一些无用特性,后者让C++更容易出错误而且更难学习。C#的设计者加入了很多C++的特性,而Java也加入了这些特性,但是C#却没有去掉C++的最糟糕的一些特性。其结果就是这样一门语言,它仍然为所有人提供了所有的特性,但其结局是内部冲突不断,而且过于复杂。
散漫的句法缺陷
最容易找出的错误是流控制和句法。C#提供了 goto command,将其作为更改程序执行点的机制。自从Edsger W. Dijkstra在1968年出版了他的《关于Go to陈述式害处的考虑(Go To Statement Considered Harmful)》。Goto语句导致代码难以调试,而且很难被测试工具处理。

在另一种不同的情况下,操作符过载同样也有很大问题,只不过层次不一样罢了。当“+”根据操作数的类型而代表任何东西的时候,代码的功能就不再透明,难以预料的副作用就会发生。
C#在安全上的削弱
C#有一个用于将代码区域标示为不安全的简单机制。在这些不安全的区域里,Java以及后来的C#安排到位了一些安全措施,用以防止程序员直接修改内存位置,以及使用点运算,但是这些措施是值得怀疑的。在使用具有垃圾清理功能的高级语言时,如果下到内存地址这一层,就会把对象/内存之间有意作出分离弄混。错误就会容易出现,调试成了恶梦,缓冲区溢出再次抬头,C和C++里著名的安全漏洞再次现身。

C#还允许对主机系统上本机库的简单访问。这个与非.NET对象相结合的访问同Java本机接口(JNI)所提供的功能类似,但是它更加危险。JNI被设计用来小心地限制Java代码以及本机代码同已定义好的接口之间的交互操作,.NET使得调用本机对象文件变得极其简单,结果导致开发人员在做这的时候,无法意识到他们在这一过程中把平台的可移植性也扔出了窗外。

SOAP的集成
C#,及其更大的扩展.NET,已经同SOAP Web服务紧密地集成在一起。SOAP是使用XML指定参数和结果值来进行远程过程调用的好标准,但是它并不是唯一的方式。利用用于Web服务的外部库能够允许Java开发人员轻易地更改其Web服务的风格,使其成为SOAP、XML-RPC,或者什么还没有发明的东西。当然,C#的开发人员总是能够选择将外部库用于SOAP的Web服务,但是由SOAP标准的紧密集成所造成的限制要比它能够做的东西更多。

所有者的恐慌
C#里最令人恐慌的特性可能就是其所有者了。微软已经为将C#和.NET用于非Windows平台进行了精心的展示,但是这在很大程度上还只是作秀。其用于非Windows平台的CLR是问题多多,错误多多。它通过ECMA标准化过程来运行C#——这一步连Sun也不敢在Java上迈出。其担心来自于微软对此可能封锁的程度,如果它愿意的话。微软已经申请了一个 专利,以排斥他人编写第三方的CRL,例如Mono计划。如果微软决定对免费的C#和.NET社区施压,它就有能力拿票子和法律的大棒把其开发活动赶回到Win32平台——当然这也不是它想看到的情况。

而Java语言则相反,不是ECMA标准的,真可惜Sun没有遵从这一标准。但是,它是可以实现的,而且没有专利的阻碍,其虚拟机和核心类库都有来自第三方的开放和封闭源代码的实现。C#看起来是免费的,其实不然,而Java看起来限制很多,但是它能够依据法律通过免费的途径来实现。

最后,我从来都没有想到我会说这个,但是Java具有更好工具的支持,即使是在考虑到集成开发环境(IDE)的情况下。Visual Studio .NET是一个很不错的IDE。它代表了多年的努力,而且特性很丰富。但是,Eclipse IDE包括了对Java的支持,它在稳定性、易用性和所提供的特性上超过了Visual Studio。IBM对Eclipse的贡献举足轻重,而且如果你信奉原来的软件格言“创建一个扔掉的(Build one to throw away)”,那么你可以把Visual Age作为第一个(被抛弃掉了的)尝试。对于使用C#的开发人员来说幸运的是,Eclipse的.NET版本正在开发中。
不是那么差,但是还不是Java

客观一点评价,C#里并没有什么很恐怖的东西。它没有Visual Basic里的那些很恐怖的东西,而且它事实上也没有继承像C里的一些东西,而这些东西会让开发人员开枪却打中自己脚。但是,底线是,C#并没有做很多东西,如果有任何东西比Java更好的话。它在某些方面很明显的要更差。在这两个非常类似的语言之间作选择的时候,请选择稍稍更好且经历风雨的那个:Java。

这篇关于C#就是Java只不过差了一点点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817985

相关文章

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Spring-DI依赖注入全过程

《Spring-DI依赖注入全过程》SpringDI是核心特性,通过容器管理依赖注入,降低耦合度,实现方式包括组件扫描、构造器/设值/字段注入、自动装配及作用域配置,支持灵活的依赖管理与生命周期控制,... 目录1. 什么是Spring DI?2.Spring如何做的DI3.总结1. 什么是Spring D

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、