Objective-C与C#相比如何?
我最近购买了一台Mac电脑,主要用于VMWare Fusion下的C#开发。有了这么多漂亮的Mac应用程序,我开始考虑Xcode潜伏在安装点击之外,学习Objective-C 这两种语言之间的语法看起来非常不同,可能是因为Objective-C源于C,而C#源于Java/C++。但是可以学习不同的语法,这样就可以了 我主要关心的是如何使用该语言,以及它是否有助于生成结构良好、可读性强且优雅的代码。我真的很喜欢C#中的LINQ和var等特性,不知道Objective-C中是否有等价的或更好/不同的特性 使用Objective-C开发时,我会怀念哪些语言功能?我将获得哪些功能? 编辑:框架比较是有用和有趣的,但语言比较才是这个问题真正要问的(我的部分错误是最初用Objective-C与C#相比如何?,c#,objective-c,C#,Objective C,我最近购买了一台Mac电脑,主要用于VMWare Fusion下的C#开发。有了这么多漂亮的Mac应用程序,我开始考虑Xcode潜伏在安装点击之外,学习Objective-C 这两种语言之间的语法看起来非常不同,可能是因为Objective-C源于C,而C#源于Java/C++。但是可以学习不同的语法,这样就可以了 我主要关心的是如何使用该语言,以及它是否有助于生成结构良好、可读性强且优雅的代码。我真的很喜欢C#中的LINQ和var等特性,不知道Objective-C中是否有等价的或更好/不同的
.net
标记)。据推测,Cocoa和.NET本身都是非常丰富的框架,它们都有自己的目的,一个是针对MacOSX,另一个是针对Windows
感谢您迄今为止深思熟虑、合理平衡的观点 我喜欢objective-c的一点是,对象系统是基于消息的,它可以让你做一些在c#中做不到的事情(至少在它们支持dynamic关键字之前是这样!) 编写cocoa应用程序的另一个好处是界面生成器,它比VisualStudio中的表单设计器好得多
obj-c让我(作为一名c#开发人员)感到恼火的是,您必须管理自己的内存(有垃圾收集,但在iPhone上不起作用),而且由于选择器语法和所有[],它可能非常冗长 在obj-c中使用的方法调用使得代码易于阅读,在我看来,它比c#优雅得多,并且obj-c构建在c之上,因此所有c代码在obj-c中都应该工作良好。不过,对我来说最大的卖点是obj-c是一种开放标准,因此您可以找到适用于任何系统的编译器。这里有一篇比较这两种语言的非常好的文章:
没有一种语言适合所有任务,Objective-C也不例外,但有一些非常具体的细节。像使用
LINQ
和var
(我不知道是否有直接替换),其中一些与语言严格相关,另一些与框架相关
(注意:正如C#与.NET紧密耦合一样,Objective-C与Cocoa紧密耦合。因此,我的一些观点似乎与Objective-C无关,但没有Cocoa的Objective-C类似于C#没有.NET/WPF/LINQ,在Mono下运行,等等。这不是通常的做法。)
我不会假装详细阐述这些区别、优点和缺点,但这里有一些让我想到的
- Objective-C最好的部分之一是动态特性——您发送消息,运行时动态路由消息,而不是调用方法。结合(明智地)动态类型,这可以使许多功能强大的模式实现起来更简单甚至微不足道
- 作为C的严格超集,Objective-C相信你知道自己在做什么。与C#和Java等语言的托管和/或类型安全方法不同,Objective-C让您可以随心所欲并体验后果。显然,这有时是危险的,但事实上,这种语言并不积极地阻止你做大多数事情,这是非常强大的。(EDIT:我应该澄清,C#也有“不安全”的特性和功能,但它们的默认行为是托管代码,您必须明确选择不使用。相比之下,Java只允许使用类型安全代码,并且决不会像C和其他语言那样公开原始指针。)
- 类别(在类上添加/修改方法而无需子类化或访问源代码)是一把可怕的双刃剑。它可以极大地简化继承层次结构并消除代码,但如果您做了一些奇怪的事情,结果有时会令人困惑
- Cocoa使创建GUI应用程序在许多方面变得更加简单,但你必须围绕这个范例来思考。MVC设计在Cocoa中非常普遍,委托、通知和多线程GUI应用程序等模式非常适合Objective-C
- Cocoa绑定和键值观察可以消除大量的粘合代码,Cocoa框架广泛地利用了这一点。Objective-C的动态分派与此密切相关,因此只要对象符合键值,对象的类型就无关紧要
- 您可能会错过泛型和名称空间,它们也有它们的好处,但在Objective-C思维和范式中,它们将是美好的,而不是必需的。(泛型都是关于类型安全和避免强制转换的,但Objective-C中的动态类型从本质上讲这不是问题。如果做得好,名称空间会很好,但它足够简单,可以避免成本可能超过好处的冲突,特别是对于遗留代码。)
- 对于并发性,块(Snow Leopard中的一个新语言特性,并在大量Cocoa API中实现)非常有用。几行(经常与Grand Central Debug,它是LIB系统10.6的一部分)可以消除回调函数、上下文等的重要样板(块也可以在C和C++中使用,当然可以添加到C,这将是可怕的)。NSOperationQueue也是向您自己的代码添加并发性的一种非常方便的方法,它可以分派自定义NSOperation子类或匿名块,GCD会自动为您在一个或多个不同的线程上执行这些块
- 这里没有技术审查,但我只是发现Objective-C的真实性要低得多
List<string> strings = new List<string>();
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)
NSMutableArray *strings = [NSMutableArray array];
[strings addObject:@"xyzzy"];
[strings addObject:@15];
NSString *x = strings[0];
[strings removeObjectAtIndex:0];
using System.Linq.Xml;
XDocument doc = XDocument.Load(xmlString);
IEnumerable<MyCustomObject> objects = doc.Descendants().Select(
d => new MyCustomObject{ Name = d.Value});