Objective-C与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中是否有等价的或更好/不同的

我最近购买了一台Mac电脑,主要用于VMWare Fusion下的C#开发。有了这么多漂亮的Mac应用程序,我开始考虑Xcode潜伏在安装点击之外,学习Objective-C

这两种语言之间的语法看起来非常不同,可能是因为Objective-C源于C,而C#源于Java/C++。但是可以学习不同的语法,这样就可以了

我主要关心的是如何使用该语言,以及它是否有助于生成结构良好、可读性强且优雅的代码。我真的很喜欢C#中的LINQ和var等特性,不知道Objective-C中是否有等价的或更好/不同的特性

使用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});