1. ホーム
  2. c#

[解決済み] Objective-CとC#の比較は?[クローズド]

2023-05-02 06:08:06

質問

私は最近 Mac を購入し、主に VMWare Fusion 上で C# 開発のために使用しています。すべての素晴らしい Mac アプリケーションがあるため、インストールをクリックした先にある Xcode について考え始め、Objective-C を学習しています。

Objective-C は C 言語を起源とし、C# は Java/C++ を起源とするため、この 2 つの言語の構文は非常に異なっているように見えます。しかし、異なる構文は学ぶことができるので、問題ないでしょう。

私の主な関心事は、その言語での作業と、うまく構造化された、読みやすく、エレガントなコードを生成するのに役立つかどうかということです。私は、C# の LINQ や var などの機能を本当に楽しんでおり、Objective-C に同等の機能またはより良い/異なる機能があるかどうかを考えています。

Objective-C で開発する場合、どのような言語機能を失うことになるのでしょうか。どのような機能を得ることができますか?

編集します。 フレームワークの比較は便利で面白いのですが、その中でも 言語 の比較は、この質問が本当に求めているものです(元々、私が .net ). おそらく、Cocoa と .NET の両方は、それ自体が非常に豊富なフレームワークであり、一方は Mac OS X、もう一方は Windows をターゲットとして、どちらもその目的を持っていると思われます。

これまでのよく考え抜かれた、合理的にバランスの取れた視点に感謝します!

どのように解決するのですか?

どんな言語もすべてのタスクに完璧に対応できるわけではなく、Objective-Cも例外ではありませんが、非常に特殊な機微が存在します。例えば LINQvar (これについては直接の代替手段を知りません)、これらのうちいくつかは厳密に言語に関するものであり、その他はフレームワークに関するものです。

( NOTE C#が.NETと密に結合しているように、Objective-CはCocoaと密に結合しています。したがって、私の指摘のいくつかは Objective-C とは無関係に見えるかもしれませんが、Cocoa なしの Objective-C は .NET / WPF / LINQ なしの C# や Mono などで動作するのと同じようなものなのです。それは、物事が通常行われる方法ではないだけです)。

違いや長所、短所を完全に詳しく説明するふりはしませんが、思い当たるものをいくつか挙げてみます。

  • Objective-C の最もよい部分の 1 つは、動的な性質です。メソッドを呼び出すのではなく、メッセージを送信し、それをランタイムが動的にルーティングします。動的な型付けと (慎重に) 組み合わせることで、多くの強力なパターンをよりシンプルに、あるいは些細なことでさえも実装することができます。

  • C言語の厳密なスーパーセットとして、Objective-Cは、あなたが何をしているかを知っていることを信頼します。C#やJavaのような言語のマネージドまたはタイプセーフのアプローチとは異なり、Objective-Cでは、やりたいことをやってその結果を経験することができます。もちろん、これは時に危険なことですが、この言語がほとんどのことを積極的に妨げないという事実は、非常に強力です。( EDITです。 C#にもquot;unsafe"機能がありますが、デフォルトの動作はマネージドコードで、明示的にオプトアウトしなければならないことを明確にすべきです。それに比べて、Javaは だけです。 はタイプセーフなコードを許容し、C やその他の言語のように生のポインタを公開することはありません)。

  • カテゴリ (サブクラス化またはソースへのアクセスなしにクラス上のメソッドを追加/変更すること) は素晴らしい諸刃の剣です。継承階層を大幅に簡略化し、コードを排除することができますが、奇妙なことをすると、その結果は時に不可解なものになります。

  • Cocoaは、多くの点でGUIアプリの作成をよりシンプルにしてくれますが、パラダイムを理解する必要があります。MVC デザインは Cocoa に広く浸透しており、デリゲート、通知、およびマルチスレッドの GUI アプリなどのパターンは Objective-C によく適しています。

  • Cocoaのバインディングとキーバリューの観察は、大量のグルーコードを排除することができ、Cocoaフレームワークは、これを広範囲に活用します。Objective-C の動的なディスパッチはこれと連動しているので、キーバリューに準拠している限り、オブジェクトの型は重要ではありません。

  • ジェネリックスと名前空間を見逃す可能性がありますし、それらには利点がありますが、Objective-C の考え方とパラダイムでは、それらは必需品というよりむしろ素敵なものでしょう。(ジェネリックスは型安全性とキャスティングの回避のためのものですが、Objective-Cの動的型付けでは、これは本質的に問題ではありません。名前空間はうまくいけば良いものですが、衝突を避けるには十分シンプルなので、特にレガシー コードでは、コストは間違いなく利点を上回ります)。

  • 並行処理については、Blocks (Snow Leopard の新しい言語機能で、多数の Cocoa API で実装されています) は非常に便利です。数行 (10.6 では libsystem の一部である Grand Central Dispatch と頻繁に結合) で、コールバック関数やコンテキストなどの重要な定型表現を排除できます (Blocks は C や C++ でも使用できますし、C# にも追加されたら素晴らしいでしょう。)。NSOperationQueue は、カスタムの NSOperation サブクラスまたは GCD が自動的に 1 つまたは複数の異なるスレッドで実行する匿名ブロックのいずれかをディスパッチすることによって、独自のコードに並行処理を追加する非常に便利な方法でもあります。