web-dev-qa-db-ja.com

JavaおよびC#のファーストクラスオブジェクトとは何ですか?

何年も前にOOプログラミングを始めたとき、変数(それが正しいWordの場合)は「プリミティブ」(int、doubleなど)またはファーストクラスのオブジェクト(int、doubleなど)であるという印象を受けました。 String、JPaneなど)これは、JavaおよびC#(@ Daniel Pryden: プリミティブ型はJavaおよびC#? )。ただし、C#ValueTypeがプリミティブ、オブジェクト、または2級オブジェクトなどの他の獣であるかどうかはわかりません。SOにはfirst-classタグの1つの使用なので、おそらくそれはもはや有用な用語ではありません。

見つかりませんでした ウィキペディアの記事 有用です(「この記事は、このテーマに関する専門家の注意を必要としています。」)。主にJavaおよびC#に関連する用語の分類法と現在の使用法に感謝します(ただし、他の言語はEnlightenmentを流します)。

説明ファーストクラスという用語とその使用範囲を理解したい。

28

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

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

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

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

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

まあそれは私の意見です...

9
Stephen C

プログラミング言語での 「第一級市民」または「第一級要素」 の概念は、英国のコンピューター科学者によって導入されました クリストファー・ストレイチー 1960年代に、最初の文脈で-クラス関数。この原則の最も有名な定式化は、おそらく コンピュータプログラムの構造と解釈 ジェラルドジェイサスマンとハリーアベルソンによるものです。

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

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

45
Jörg W Mittag

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

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

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

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

5
Konamiman

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

3
Tarik

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

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

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

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

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

1
PhiLho

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

したがって、たとえば、Javaには次の概念があります-Javaオブジェクト、Javaプリミティブ、フィールド、メソッドなど(Javaオブジェクトとは、オブジェクトタイプのインスタンスであるすべてのものを意味します)。 dは、Java JavaオブジェクトとJavaプリミティブの両方が、この言語のファーストクラスの市民であると言います。

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

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

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

1
alsor.net

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

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

Uが他の言語では珍しいと思うが、c#は式であるファーストクラスオブジェクトの別の例

1
Ilya Khaprov