32

何年も前に OO プログラミングを始めたとき、変数 (それが正しい言葉である場合) は「プリミティブ」(int、double など) またはファーストクラスのオブジェクト (String、JPane など) のいずれかであるという印象を受けました。これは、Java と C# のプリミティブに関する最近の回答 (@Daniel Pryden: Java と C# でプリミティブ型が異なりますか? ) によって強化されます。ただし、C# の ValueTypes がプリミティブなのか、オブジェクトなのか、それとも第 2 級オブジェクトなどの他の獣なのかはわかりません。SO はfirst-classタグの用途が 1 つしかないので、もはや有用な用語ではないかもしれません。

ウィキペディアの記事は役に立ちませんでした(「この記事は、このテーマに関する専門家の注意が必要です。」)。分類法と、主に Java と C# に関連する用語の現在の使用法に感謝します (ただし、他の言語では啓蒙が行われる可能性があります)。

明確化:ファーストクラスという用語と、その使用範囲を理解したいと思います。

4

7 に答える 7

47

プログラミング言語における「一級市民」または「一級要素」の概念は、1960 年代にイギリスのコンピューター科学者クリストファー・ストラチーによって一級関数の文脈で導入されました。この原則の最も有名な定式化は、おそらくGerald Jay Sussman と Harry Abelson によるStructure and Interpretation of Computer Programsにあります。

  • 変数によって名前を付けることができます。
  • これらは、引数としてプロシージャに渡すことができます。
  • 手続きの結果として返却される場合があります。
  • それらはデータ構造に含まれる場合があります。

基本的に、これは、このプログラミング言語要素を使用して、プログラミング言語の他のすべての要素で実行できるすべてのことを実行できることを意味します。

于 2009-10-21T16:41:22.503 に答える
10

問題は、「ファーストクラスオブジェクト」が明確に定義された概念ではないことです。

通常の使用法では、「オブジェクト」はX、Y、Zのすべてのプロパティを持つ必要があるクラスのものであると誰かが言います。しかし、これらのプロパティのすべてを持たないものもありますが、それらは一種です。オブジェクトっぽい。したがって、前者を「ファーストクラス」オブジェクトと呼び、残りを「ファーストクラス」とは呼びません...そしてオブジェクトではない可能性があります。

問題は、モノを「ファーストクラス」オブジェクトにするために必要なプロパティに関するビューがいくつもあることです。そして、反対意見を持つ人々が合意に達する見込みはありません。(たとえば、Javascript言語の専門家は、オブジェクトがテンプレートベースの場合、オブジェクトはファーストクラスにすぎないと激しく主張する可能性があります。)

「ファーストクラス」についての唯一の本当に確かな洞察は、JavaとC#のそれぞれの言語仕様から収集できるものです。そして、それらは実際にはそれぞれの言語/型システムの範囲内でのみ適用され、複数の言語にまたがって適用されるわけではありません。

したがって、「ファーストクラスのJavaオブジェクト」または「ファーストクラスのC#オブジェクト」は意味があるかもしれませんが、コンテキストから除外された「ファーストクラスのオブジェクト」は意味がありません。

それが私の意見です...

于 2009-10-21T07:21:09.263 に答える
5

.NET では、プリミティブ型とクラスはありません。代わりに、構造体とクラスがありますが、構造体はクラスの多くの機能 (プロパティやメソッドを持つ機能など) を共有し、Objectクラスからも継承します。

intたとえば、C# で記述する場合、これはInt32構造体の単なる言語ショートカットです。たとえばint i=int.Parse("34")、またはstring s=1234.ToString(). タイプ の変数に構造体インスタンスを割り当てるためにObjectボックス化/ボックス化解除メカニズムがあります。

一方、Java では、実際にプリミティブ型とクラスの二分法があります。たとえば、 type の変数に対して操作を実行するには、補助クラスintを使用する必要があります。Integerこれは、.NET と比較して Java が気に入らない点の 1 つです。

編集。「ファーストクラス オブジェクト」(またはクラス) について読むとき、それは「完全に機能するオブジェクト」、つまり、他のシステム クラスまたはユーザー作成クラスと同じ機能を持つクラスを意味します。これは、「限定されたプリミティブ型」と区別するためです。

于 2009-10-21T07:17:18.870 に答える
3

Java のプリミティブ データ型ごとに、コア クラス ライブラリはそれを Java オブジェクトとして表すラッパー クラスを提供します。たとえば、Int32 クラスは int データ型をラップし、Double クラスは double データ型をラップします。

一方、C# のすべてのプリミティブ データ型は System 名前空間のオブジェクトです。データ型ごとに、短縮名またはエイリアスが提供されます。たとえば、int は System.Int32 の短い名前で、double は System.Double の短い形式です。

次の表に、C# のデータ型とそのエイリアスの一覧を示します。ご覧のとおり、これらのうち最初の 8 つは、Java で使用可能なプリミティブ型に対応しています。ただし、Java のブール値は C# では bool と呼ばれることに注意してください。

から: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx

于 2009-10-21T07:16:31.677 に答える
1

率直に言って、私は「ファーストクラスのオブジェクト」が何であるかわかりません...
しかし、関数はファーストクラスの市民、またはファーストクラスの値であると言って、Luaのドキュメントとメーリングリストで同様のイディオムの使用法を最初に見つけました。

Luaの作者の1人にそれが何であるかを説明させました:Luaでのプログラミング:6-関数の詳細

これは、Luaでは、関数は数値や文字列などの従来の値と同じ権限を持つ値であることを意味します。関数は、変数(グローバルとローカルの両方)とテーブルに格納でき、引数として渡すことができ、他の関数から返すことができます。

どういうわけか、この定義はJavaのオブジェクトに適用されます。オブジェクトを変数に格納したり、配列に格納したり、関数パラメーターとして使用して返したり、HashMapやその他のコレクションのキーとして使用したりできます。
この用語がどのように使用されているかはわかりません。オブジェクトの場合ですが、少なくともそれは理にかなっています... :-)

Cのような言語では、オブジェクトはいくつかのトリック(C ++を再作成するなど)を使用して最初から作成する必要があるため、ファーストクラスではありません。オブジェクトを操作するには、ポインターを渡す必要があります。

于 2009-10-21T07:29:32.787 に答える
1

「ファーストクラスのオブジェクト」について「オブジェクト」と言うとき、その言語で作成するオブジェクトではなく、言語のいくつかの概念を意味します。だから「一等市民」という言葉もある。

たとえば、Java には、Java オブジェクト、Java プリミティブ、フィールド、メソッドなどの概念があります (Java オブジェクトとは、オブジェクト型のインスタンスを意味します)。Java では、Java オブジェクトと Java プリミティブの両方が言語の第一級市民であると言えます。

C# には、ファーストクラスのプロパティを「テスト」できる追加の概念がいくつかあります。たとえば、代表者。変数にデリゲートを割り当て(名前を付けます)、引数としてメソッドに渡し、メソッドから返し、データ構造に組み込むことができます(たとえば、デリゲートの辞書を持っています)。したがって、デリゲートは C# のファースト クラス オブジェクトであると言えます。C# の他の概念 (イベント、プロパティなど) に進むことができます。

関数型言語には「関数」という概念があり、もちろん関数型言語の中でも一級市民です。第一級の概念 (名前、パス、リターン、組み込み...) として「機能」があれば、言語を関数型言語と呼ぶことができると思います。

したがって、ある言語が何らかの概念をもたらす場合、言語自体でこの概念の力を「測定」できます。

于 2009-10-21T08:35:28.787 に答える
1

http://onjava.com/onjava/2003/05/21/delegates.html

つまり、C# メソッドは、別のメソッドで渡すことができるため、ファースト クラス オブジェクトです。他の値 (文字列、数値、ユーザー作成オブジェクト) と同じようにメソッドを使用できます。

他の言語では一般的ではないが、c# で見つけられるファースト クラス オブジェクトの別の例は Expressions です。

于 2009-10-21T07:16:37.030 に答える