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

Objective-C与C#相比如何?

如何解决《Objective-C与C#相比如何?》经验,为你挑选了6个好方法。

我最近购买了一台Mac,主要用于VMWare Fusion下的C#开发.随着所有不错的Mac应用程序的出现,我开始考虑Xcode潜伏,只需点击一下即可安装,并学习Objective-C.

两种语言之间的语法看起来非常不同,可能是因为Objective-C起源于C,而C#起源于Java/C++.但是可以学习不同的语法,所以应该没问题.

我主要担心的是使用该语言,是否有助于生成结构良好,可读且优雅的代码.我非常喜欢LINQ和C#中的var等功能,并想知道Objective-C中是否有等价物或更好/不同的功能.

我会错过使用Objective-C开发哪些语言功能?我会获得什么功能?

编辑:框架比较是有用和有趣的,但语言比较是这个问题的真正要求(部分是我最初标记的错误.net).据推测,Cocoa和.NET本身都是非常丰富的框架,两者都有其目的,一个针对Mac OS X和另一个Windows.

感谢您到目前为止经过深思熟虑和合理平衡的观点!



1> Quinn Taylor..:

没有语言适合所有任务,Objective-C也不例外,但有一些非常具体的细节.就像使用LINQvar(我不知道直接替换)一样,其中一些严格与语言相关,而另一些则与框架相关.

(注意:就像C#与.NET紧密结合一样,Objective-C与Cocoa紧密结合.因此,我的一些观点似乎与Objective-C无关,但没有Cocoa的Objective-C类似于C#而没有.NET/WPF/LINQ,在Mono下运行,等等.这不是通常的事情.)

我不会假装完全阐述差异,优点和缺点,但这里有一些想到的东西.

Objective-C最好的部分之一是动态性质 - 而不是调用方法,您发送消息,运行时动态路由.结合(明智地)动态类型,这可以使许多强大的模式更简单甚至无法实现.

作为C的严格超集,Objective-C相信您知道自己在做什么.与C#和Java等语言的托管和/或类型安全方法不同,Objective-C可以让您按照自己的意愿行事并体验后果.显然这有时会很危险,但是语言并没有主动阻止你做大多数事情这一事实非常强大.(编辑:我应该澄清C#也有"不安全"的特性和功能,但它们的默认行为是托管代码,你必须明确选择退出.相比之下,Java 允许类型安全代码,并且永远不会暴露原始指针C和其他人的方式.)

类别(在没有子类或访问源的类上添加/修改方法)是一把令人敬畏的双刃剑.它可以极大地简化继承层次结构并消除代码,但如果你做了一些奇怪的事情,结果有时会令人费解.

Cocoa在许多方面使创建GUI应用程序变得更加简单,但你必须围绕这个范例.MVC设计在Cocoa中很普遍,代理,通知和多线程GUI应用程序等模式非常适合Objective-C.

Cocoa绑定和键值观察可以消除大量的胶水代码,Cocoa框架可以广泛利用这一点.Objective-C的动态调度与此相辅相成,因此只要符合键值,对象的类型就无关紧要.

您可能会错过泛型和命名空间,并且它们有其优点,但在Objective-C思维模式和范例中,它们将是细节而非必需品.(泛型都是关于类型安全和避免转换,但是Objective-C中的动态类型使得这基本上不是问题.如果做得好,命名空间会很好,但它足够简单以避免冲突,成本可能超过收益,特别是对于遗留代码.)

对于并发性,Blocks(Snow Leopard中的一种新语言功能,并在许多Cocoa API中实现)非常有用.几行(通常与Grand Central Dispatch相结合,它是10.6上的libsystem的一部分)可以消除回调函数,上下文等的重要模板.(块也可以在C和C++中使用,并且当然可以添加到C#中,通过调度自定义NSOperation子类或GCD在一个或多个不同线程上自动执行的匿名块,NSOperationQueue也是一种非常方便的方法,可以为您自己的代码添加并发性.


奎恩,这不是头发分裂.我只是指出,最初作为语言比较的内容变成了关于Cocoa在你的回复中某些方面是如何擅长的一般性讨论.我仍然想指出你对Cocoa的观点不是_comparisons_ - 他们说"它做得很好" - 而且很可能就是这样 - 但他们并没有说"它确实比X#更好/更差X#+ WPF",这是一个广泛的问题.
我只是提到Cocoa,因为Objective-C中编程的大部分吸引力都归功于Cocoa框架.如果没有.NET和/或WPF,C#会有趣吗?提问者特别提到了LINQ,所以他显然超越了语言和体验.
从技术上讲,C#具有ObjC所做的所有非类型安全的电源功能:原始指针,指针算术,绑定未检查的数组,联合,`alloca`.它只是不能使它们易于访问 - 您需要明确选择.
哪个好.我不是想和C#争吵.如果我必须编写Windows软件,那就是我使用的.我只是想指出语言和相关工具之间的相似点和不同点.你显然对C#更有经验,而且我有Objective-C.我很感激你的澄清,但也许更有建设性的答案和更少的头发分裂将是最有用的.
+1优秀的答案Quinn
关于你的答案的新增内容:ObjC块只是一流的匿名函数,对吧?如果是这样,C#拥有它们(作为匿名委托和lambdas).它们在并发上下文中的特殊用途是.NET 4.0 - Parallel LINQ.Java具有匿名内部类,它们也可以在该角色中起作用,尽管它们不捕获可变本地,并且对于这样的构造非常冗长.

2> 小智..:

我已经用C,C++和C#编程了20多年,最初是在1990年开始的.我刚刚决定看一下iPhone开发和Xcode以及Objective-C.哦,我的天啊......关于微软的所有抱怨我收回了,我现在意识到代码有多么糟糕.与C#相比,Objective-C过于复杂.我已经被C#宠坏了,现在我感谢微软付出的所有努力.只是阅读使用方法调用的Objective-C很难阅读.C#很优雅.这只是我的观点,我希望苹果的开发语言能像苹果产品一样好,但亲爱的我,他们有很多需要向微软学习的东西.毫无疑问,C#.NET应用程序我可以比XCode Objective-C更快地启动和运行应用程序.苹果当然应该从微软的书中脱颖而出,然后我们就拥有了完美的环境.:-)


即使您已经浏览了一本iPhone开发书,您仍然可以在拥有20年经验的平台上更快地创建应用程序?惊人
我和Waz有着完全相同的经历.在我开始学习Objective C之后,我也非常感谢Microsoft在C#和开发工具(如Visual Studio)中所做的工作.
这个最佳答案如何?这不是一个简明的答案,只是对他一夜之间学到的某种语言的明显偏见,而不是他用了20多年的语言......显然你不会对新语言有所了解
这也是我在研究objective-c时的经验,与c#相比过于复杂.@ alexy13你错过了原始邮件中c和c ++的哪一部分?在一个语言系列中拥有数十年的经验有助于评估用同一家族的另一种语言完成同样工作的难度.
`"用方法调用阅读Objective-C很难阅读" - 这里只是*一个*非常**的主观**论点,这里提到的是Obj-C的缺点.所有其他的只是有争议的言论.
-1所有意见.零事实.

3> TimothyP..:

这里没有技术评论,但我发现Objective-C的可读性差得多.鉴于Cinder6给你的例子:

C#

List strings = new List();
strings.Add("xyzzy");                  // takes only strings
strings.Add(15);                       // compiler error
string x = strings[0];                 // guaranteed to be a string
strings.RemoveAt(0);                   // or non-existant (yielding an exception)

Objective-C的

NSMutableArray *strings = [NSMutableArray array];
[strings addObject:@"xyzzy"];
[strings addObject:@15];
NSString *x = strings[0];
[strings removeObjectAtIndex:0];

看起来很糟糕.我甚至尝试过阅读2本书,他们很早就把我弄丢了,通常情况下我不会用编程书籍/语言.

我很高兴我们有Mono for Mac OS,因为如果我不得不依靠Apple给我一个良好的开发环境......


我并没有真正发现语法有什么问题 - 这个_feels_可读性较差的主要原因是因为1)来自C背景的每个人都不熟悉,2)它用于普通C构造的中间,它在那里看起来很陌 另一方面,Smalltalkish命名参数作为方法名称的一部分实际上使得调用更容易理解.事实上,你的C#代码示例很好地演示了它 - 它不会编译,因为`List .Remove`将_string_作为参数,并删除该字符串的第一个出现.要通过索引删除,您需要`RemoveAt`.
忽略第一行应该以`[NSMutableArray array]`结尾(他正在泄漏内存)而第四行应该以`NSString*x`或`id x`开头(编译错误)......是的,目标 - C缺乏泛型(我老实说不要错过它们),你不用数组语法索引对象,而且API通常更冗长.To-may-to,to-mah-to.这真的归结为你更喜欢看到的东西.(您可以在C++ STL中编写相同的代码,我认为它很可怕.)对我来说,可读代码通常意味着代码文本告诉您它正在做什么,因此Objective-C代码更可取.
...而带有`removeObjectAtIndex:`的ObjC版本,虽然更详细,但它的作用也是明确的.
优点,帕维尔.而且,`strings [0]`和`strings.RemoveAt(0)`之间的不一致性会降低清晰度,至少对我来说是这样.(另外,当方法名称以大写字母开头时,它总是让我感到烦恼......我知道这是一个小问题,但这很奇怪.)
就我而言,对于许多人来说,"工具"的可读性会影响我的工作效率.使用多种语言我感到舒适和富有成效Objective-C然而,从来就不是其中之一,那并不是因为缺乏尝试.但同样,在一天结束时,这完全取决于个人偏好.与20年前不同,您不会被迫使用语言X来定位平台Y.您选择最适合您的方式.
真的够了.再次个人偏好,但我讨厌用数组表示法掩盖方法的语法.也许那是因为我偶尔也会使用普通的C数组,混合符号会比代码理解更有害.
我想要注意的是,没有一个代码示例是我的,它们是从之前链接的页面中获取的:p
使用现代Objective-C,这将是:NSMutableArray*strings = @ []; [strings addObject:@ 15]; NSString*x =字符串[0]; 等等...
不完全相同,但类似,目标c在方法名称级别上有这个,并且c#在参数级别上有它(因此也传递额外的参数并影响处理时间),目标 - c没有这个巨大的开销.有关命名参数http://www.dotnetperls.com/named-parameters的一些测试,请参阅此处
-1一般人倾向于避免与他们的习惯/知识有所不同,所以仅仅基于其所谓的"可读性"抛弃编程语言并不是很有根据.编程语言是一种工具.

4> PeyloW..:

手动内存管理是Objective-C的初学者似乎最常遇到的问题,主要是因为他们认为它比它更复杂.

Objective-C和Cocoa的扩展依赖于执行方面的约定; 知道并遵循一小部分规则,您可以通过动态运行时获得大量免费回报.

不是100%真实的规则,但每天足够好是:

每次调用alloc都应与release当前范围的末尾匹配.

如果已经获得了方法的返回值,alloc那么它应该返回return [value autorelease];而不是由a匹配release.

使用属性,没有规则三.

更长的解释如下.

内存管理基于所有权; 只有一个对象实例的所有者应该永远释放对象,大家还应该总是什么都不做.这意味着在95%的代码中,您将Objective-C视为垃圾收集.

那么其他5%呢?您需要注意三种方法,从这些方法接收的任何对象实例都归当前方法范围所有:

alloc

任何以单词new开头的方法,例如newnewService.

包含单词copy的任何方法,例如copymutableCopy.

该方法有三个可能的选项,如何在退出之前如何处理它拥有的对象实例:

release如果不再需要,请将其释放.

通过简单地分配它来为a字段(实例变量)或全局变量赋予所有权.

放弃所有权,但在实例离开之前通过呼叫让其他人有机会取得所有权autorelease.

那么你什么时候应该主动通过电话取得所有权retain?两种情况:

在初始化程序中分配字段时.

手动实现setter方法时.


为了澄清,Mac上的Objective-C完全支持垃圾收集,并且不需要进行任何手动内存管理.仅在iOS中需要手动内存管理.
尽管如此,学习内存管理的基础知识还是很好的,如果只是为了在需要时提高性能(不必运行垃圾收集).
iOS 5引入了ARC,无需手动释放已分配的对象.但它仍然没有C#那么容易.你必须记住,Objective-C已有20多年的历史了,并且它保留了当时语言的一些要求:即知道何时分配以及何时释放/释放内存.C#已经为您删除了所有这些内容.话虽如此,Cocoa有许多API在Windows Phone中无法访问.比如手势,在UI事件等方面有更多的控制......
+1优秀摘要.听起来和我多年前学习C语言时非常相似.

5> user561168..:

当然,如果你在生活中看到的一切都是目标C,那么它的语法看起来是唯一可能的.我们可以称你为"编程处女".

但是由于许多代码都是用C,C++,Java,JavaScript,Pascal和其他语言编写的,所以你会发现ObjectiveC与所有代码都不同,但并不是很好.他们有理由这样做吗?让我们看看其他流行语言:

C++为C添加了很多额外内容,但它只根据需要改变了原始语法.

与C++相比,C#增加了很多额外功能,但它只改变了C++中的丑陋(比如从界面中删除"::").

Java改变了很多东西,但它保留了熟悉的语法,除了需要更改的部分.

JavaScript是一种完全动态的语言,可以做很多ObjectiveC不能做的事情.尽管如此,它的创造者并没有发明一种新方法来调用方法和传递参数只是为了与世界其他地方不同.

Visual Basic可以不按顺序传递参数,就像ObjectiveC一样.您可以为参数命名,但也可以按常规方式传递它们.无论你使用什么,它都是以每个人都能理解的正常逗号分隔方式.逗号是通常的分隔符,不仅在编程语言中,而且在书籍,报纸和书面语言中.

Object Pascal具有与C不同的语法,但其语法实际上更容易为程序员阅读(可能不是计算机,但是谁关心计算机的想法).也许他们离题了,但至少他们的结果更好.

Python有不同的语法,比Pascal更容易阅读(对于人类而言).因此,当他们改变它,使它变得不同时,至少它们使我们的程序员更好.

然后我们有ObjectiveC.添加一些改进C,但发明自己的接口语法,方法调用,参数传递和什么不.我想知道他们为什么不交换+和 - 所以加上减去两个数字.它会更酷.

史蒂夫乔布斯通过支持ObjectiveC搞砸了.当然他不能支持C#,这是更好的,但属于他最糟糕的竞争对手.所以这是一个政治决定,而不是一个实际的决定.当出于政治原因做出技术决策时,技术总会受到影响.他应该领导他做得好的公司,并将编程问题留给真正的专家.

如果他决定用除ObjectiveC以外的任何其他语言编写iOS和支持库,我相信会有更多的iPhone应用程序.对于除了铁杆粉丝,处女程序员和史蒂夫乔布斯之外的所有人,ObjectiveC看起来都是荒谬,丑陋和令人厌恶的.


最后2段总结了一切

6> jonnii..:

我喜欢objective-c的一件事是对象系统基于消息,它可以让你做很多在C#中无法做到的好事(至少在他们支持动态关键字之前!).

编写可可应用程序的另一个好处是Interface Builder,它比Visual Studio中的表单设计器好很多.

关于obj-c的事情让我烦恼(作为C#开发人员)是你必须管理自己的内存(有垃圾收集,但这在iPhone上不起作用)的事实,并且它可能非常冗长,因为选择器语法和所有[].


值得指出的是,Objective-C允许选择静态类型,这确实提供了更高程度的类型安全性.有些人喜欢编译时检查,有些人更喜欢运行时检查.好的(在两种语言中)是选择不必是绝对的.
Windows窗体设计器不是那么好,但如果你能够使用WPF(从.NET 3.0开始),Expression Blend很难被击败......
`dynamic`只会让你半途而废 - 实现一个真正的动态对象,即使在消息委派等微不足道的事情上,即使在C#4.0中也很繁琐.另一方面,通过la ObjC的灵活性真实动态消息的价格是丢失类型安全性.
推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有