有没有人写过比.NET行李更大的应用程序?人们习惯于批评VB6的2 MB运行时间,但它很少使它伴随的应用程序相形见绌.
今天尽管在我的机器上安装了Vista,但我必须下载35 MB的3.5框架并重新启动,然后试用一半大小的应用程序.
当你考虑到降低的源代码安全性时,我想知道为什么有人会在.NET中开发一个Windows应用程序,而不是在允许构建本机可执行文件的语言中.
在编写在Windows上运行的应用程序时,.NET有哪些优势可以解决这些缺点?
PEOPLE:请注意,这是写在2009年2月,并说什么是适当的,在那个时候 -在2012年年底,在我吼(3+年以后)是没有意义的.:-)
Delphi对Win32有一些相当大的优势.并不是说.NET应用本质上是坏的,但尝试:
在Win95/ME上运行.NET应用程序(任何版本),其中.NET不存在(AFAIK)
分发任何小型(<1.5 MB).NET应用程序(是的,软盘驱动器仍然存在)
在没有Internet访问权限的系统上提供任何.NET应用程序(是的,它们存在)
在没有广泛高带宽的国家/地区分发.NET应用程序
让人们看不到您的源代码而不花费大量的面团(反思,有人吗?)
.NET中的垃圾收集可能非常好,但任何对编程有所了解的人也可以使用Delphi轻松处理内存的手动分配/释放,并且GC可以使用引用计数接口.是不是所有非程序员都将VB的伪GC扩散的事情之一?IMO,GC是使.NET变得危险的事情之一,就像VB危险一样 - 它使事情变得太容易,并且让那些真正不知道他们正在做什么的人来编写最终弄得一团糟的软件.(而且,在我在这里被烧死之前,这对于那些知道他们正在做什么的人来说也是很好的,VB也是如此;我只是不确定技术人员对我们的危害的优势来自不熟练的.)
Delphi Prism(AKA Rem Objects Oxygene,以前的Chrome)提供了Delphi的GC版本,需要它的人正在寻找,以及ASP.NET和WPF/Silverlight/CE,Delphi的可读性(和缺乏花括号) .对于那些不支持Unicode的人(像我一样),Delphi 2007提供了ASP.NET和VCL.NET,以及本机Win32支持.而且,在我工作的地方,当工作站每三年只升级一次(至少),而我们刚刚摆脱最后一台Win95机器,因为它不是升级的优先级,.NET框架是一个问题.(特别是公司代理要求只允许少数人访问互联网,限制带宽和下载功能,以及允许不使用USB设备的适当非管理员帐户,
我使用.NET语言(C#,Delphi Prism)工作,但是全职和侧面的面包和黄油来自Win32和Delphi.
好吧,我怀疑这会说服你,因为你不想被说服,但这是我对.NET优于旧技术的看法.我不会声称每个优势都适用于您在问题中提到的每种语言,或者.NET是完美的,但是:
托管环境更早发现常见错误并提供新机会:
强类型避免将一种类型视为另一种类型
垃圾收集很大程度上消除了内存管理问题(不完全是,我很乐意承认)
"分段错误"通常转换为"NullReferenceException" - 但是更容易调试!
(当然从对CLR错误的可能性,一边),缓冲区溢出没有机会 - 即立即删除一个很大的安全隐患
声明性安全模型和精心设计的运行时允许代码在各种信任级别下运行
JITting允许CLR采取没有必要(比一些互操作的情况下除外)重新编译在64位计算机上运行的优点
未来处理器的发展也可以通过抖动针对性,使与开发商(包括无需重建或分发多个版本)的部分没有工作的改进.
反射允许在非托管环境中不可能或难以处理的各种事物
一个现代的面向对象框架:
具有执行时间知识的泛型(与Java中的类型擦除相反)
合理的线程支持,.NET 4.0中引入了一组新的原语(Parallel Extensions)
从一开始就具有国际化和Unicode支持 - 只需要考虑一种字符串类型,一件事:)
Windows Presentation Framework提供了一个现代的GUI框架,允许声明性设计,良好的布局和动画支持等
与本地库互操作的良好支持(P/Invoke的是这样比JNI更好得多,例如)
与错误代码相比,异常更具信息性(并且更易于处理)
LINQ(.NET 3.5中)提供过程中的数据的工作,以及让不同的选项与数据库,Web服务,LDAP等工作的一个可爱的方式
代表允许使用VB和C#进行有些功能的编码风格; 由于lambda表达式,这在C#3.0和VB9中更好.
LINQ to XML是我用过的最好的XML库
使用Silverlight作为RIA框架,您可以在轻量级客户端和其他访问方法之间共享大量代码
一个最好的版本控制故事,包括绑定重定向,运行时首选项等
一种针对多种语言的框架:
共享组件比(比如)COM更简单
语言选择可以由任务和团队经验驱动.从.NET 4.0开始,这将特别重要:功能语言更合适,使用F#; 如果动态语言更合适,请使用IronRuby或IronPython; 在所有语言之间轻松互操作
坦率地说,我认为C#是一种比VB或C++更清晰的语言.(我不知道Delphi和我听说过它的好东西 - 嘿,你现在可以用Delphi定位.NET.)
大多数这一点 - 以及声音 - 我认为是.NET可以更快地开发更强大的应用程序.
要解决您在问题中提到的两个具体问题:
如果您的客户运行Vista,他们已经拥有.NET 3.0.如果他们运行的是XP SP2或SP3,他们可能至少拥有.NET 2.0.是的,如果你想使用它,你必须下载更新版本的框架,但我认为这是一个非常小的问题.我认为将应用程序的大小与框架的大小进行比较并不合理.您是否将应用程序的大小与操作系统的大小或IDE的大小进行比较?
我不认为反编译几乎像大多数人一样存在问题.你真的需要考虑你害怕的事情:
如果您害怕人们复制您的实际代码,如果您了解基本设计,那么从头开始编码通常要容易得多.请记住,反编译器不会给出本地变量名称(假设您不分发PDB)或注释.如果您的原始源代码与反编译版本一样容易理解,那么您遇到的问题比盗版更大.
如果你害怕人们绕过你的许可并盗用你的代码,你应该记住为阻止人们盗用本机应用程序付出了多少努力 - 以及它有多么无效.
很多.NET的使用都在服务器上或内部应用程序中 - 在这两种情况下,反编译都不是问题.
我在这篇关于反编译和混淆的文章中写了更多关于这个主题的文章.
仅举几例:
自动内存管理,垃圾回收
类型安全
边界检查
访问您不必创建的数千个类
好的,首先,没有一种语言/平台能够普遍优越.
专业化将始终在某些领域提供更好的用例,但通用语言将适用于更多领域.
多范式语言将受到范例之间复杂的边界情况的影响,例如
在任何函数语言中键入推断,当提供子类时也允许OOP
C++的语法非常复杂,这直接影响了其工具链的能力.
co/contra方差的复杂性加上c#中的泛型很难理解.
较旧的语言将具有可用的现有代码库,这既是积极的(经验丰富,经过充分测试,广泛支持文献),也是负面的(由此产生的对变化的惯性,多种不同的做事方式导致新进入者的混淆).
选择/使用这两种语言和平台,就像大多数事情一样,是利弊的平衡.
在下面的列表中,Delphi有一些相同的优点和缺点,但也有很多不同.
.Net的潜在负面因素(如果它们不是问题,那么它们不是负面的)
是的,您需要部署(并安装)运行时,并且它很大.
如果你想要一种具有多重继承的语言,你就不会得到它
BCL馆藏库存在一些严重缺陷
在MS世界之外没有得到广泛支持(单声道很棒,但它显着落后于官方实施)
潜在的专利/版权保留
Jitted(忽略ngen)启动时间总是变慢,需要更多内存.
还有更多,但这些是亮点.
潜在的积极因素(如果它们对您无关紧要)
一个通用的GC,没有参考计数阻止某些数据结构可用,我知道没有广泛使用的功能语言没有GC,我想不出过去10年没有至少可选GC的重要语言.如果你认为这不是什么大问题,那么你似乎只是少数.
一个大的BCL(有些部分不像其他部分那么好,但它非常宽泛)
可以使用大量语言(以及数量惊人的范例)(我在一个更广泛的应用程序中使用c#,f#,C++/CLI,使用每个最有意义但又能够轻松使用其中一个的方面)另一个).
全功能内省与声明性编程支持相结合.通过这种方式,各种各样的框架变得更加简单和易于使用.
Jitted - 底层CPU架构的改变可以在很大程度上透明,预编译语言无法使用复杂的运行时优化(目前java正在做得更好)
内存访问安全
Fusion dll加载和系统dll的GAC
同样特别针对c#
缺点:
基于C基础的语法
(前4.0)后期绑定仅通过继承
比一些命令式语言更冗长
处理复杂的嵌入文字(正则表达式/ xml /多行字符串)
闭包内的变量捕获可能会令人困惑
嵌套的生成器既麻烦又令人震惊
优点:
基于C基础的语法
通过lambdas提供大量功能支持
表达式允许对非代码区域(如Linq to SQL)进行编译时验证
强类型但有一些类型推断使这更容易
如果你真的需要不安全就有你
通过P/Invoke与现有C++ ABI代码的交互既简单又清晰.
内置多播事件模型.
轻量级运行时代码生成
C基础真的是赞成和反对.大量程序员可以理解这一点(与基于pascal的风格相比),但有一定的瑕疵(switch语句就是一个明显的例子).
强/弱/静态/动态类型系统是一个两极分化的争论但是,当类型系统更加限制它应该努力不要求过多的冗长时,肯定没有争议,c#当然比许多更好看待.
对于许多内部业务线应用程序而言,大量的.Net平台缺点绝对不重要(受控部署是公司内部常见且解决良好的问题).因此使用.Net(这在很大程度上意味着c#,对不起VB.Net人员)是Windows架构中新开发的一个非常明显的选择.
使用它开发复杂(和简单)应用程序的"简单性".在框架中已经为您编写了许多基本内容,您可以使用它.今天下载35mb文件要比8 - 6年前的2mb文件容易得多.
有很多原因.我不太了解RealBasic,但就Delphi而言:
不如.NET,更小的开发社区.网上的许多德尔福资源都是古老而过时的.
在Delphi 2009之前,Delphi没有完全的unicode支持.
我不知道Delphi 2009,但2007年没有很好的垃圾收集.它有一些笨重的引用计数,需要代表开发人员进行一些干预..NET有一个更高级的GC,可以为您提供几乎所有功能.
.NET拥有更大的标准库和更多最新的第三方库.
像C#这样的.NET语言可以说是更好的,对于那些刚接触语言的人来说当然更容易理解.
.NET开发人员在这里引用了许多所谓的优点,不应该在那个比较中,因为Delphi也有它们:
类型安全
边界检查
访问您不必创建的数千个类(组件)
然而,在.NET中有一些东西,Delphi没有开箱即用,只有一些可以通过库和自己的代码添加.仅举几例:
支持在同一运行时工作的多种语言 - 允许为问题选择匹配语言(例如使用F#进行函数编程)
动态源代码生成和编译 - 这对于Delphi程序员来说是如此陌生,以至于他们甚至可能看不到它如何有用[1]
多播事件
更好的多线程支持(例如BackgroundWorker类,异步委托)
无缝支持32位和64位进程
弱参考
[1]如果您不知道但感兴趣,请查看Marc Clifton的主页,特别是关于声明性编程的文章.
编辑:我想回应梅森惠勒的评论:
动态代码:我知道有一些解决方案可以在应用程序中嵌入Pascal脚本.但是,内部对象层次结构的某些部分可用于脚本引擎,并且在运行时也可以使用与代码相同的编译器.Delphi编译器和脚本引擎的编译器之间总是存在差异.无论如何,你用.NET获得的东西远远超出Delphi可用的任何东西.无论如何,关于是否能够为Delphi编写类似的基础架构并不是重点,关键在于,当你需要它时,它已经存在于你身边.
重新组播事件:确切地说,有方法对其进行编码,但它不是Delphi/VCL开箱即用的一部分.这就是我上面所说的.
重新弱参考:你遗憾地错了.尝试以非平凡的方式使用接口,在路上创建循环引用.然后你必须开始使用类型转换并希望弱引用.