web-dev-qa-db-ja.com

.NETのすべてがオブジェクトですか?

「ほぼ」すべてがオブジェクトであるという論争を解決するのを手伝ってくださいStack Overflowの質問への回答初心者として、C#を学ぶ前に注意すべきことはありますか? )。 Visual Studioのすべてが少なくとも構造体として表示されるので、そうだと思いました。 「現代のジャッカス」にならないように、参考文献を投稿してください( This American Life )。

この質問は、必ずしも.NETではなくC#と、内部でデータを処理する方法(明らかに、すべて1と0)に言及していることに注意してください。

「すべてがオブジェクトである」へのコメントは次のとおりです。

  • ええ、いや、そうではありません。 –バイナリの心配
  • 例を教えてください...– scotty2012
  • すべてが基本型オブジェクトから派生したものではありませんか? –リズル
  • ほとんどのものはオブジェクトです...– Omar Kooheji
  • 値型、int、double、オブジェクト参照(それ自体のオブジェクトではない)などはオブジェクトではありません。それらはオブジェクトのように見えるように「ボックス化」できますが(i.ToString()など)、実際にはプリミティブ型です。エントリを「ほぼすべてがオブジェクトです」に変更すると、反対票が削除されます– Binary Worrier
  • 説明に感謝します。 C#でintなどと対話できる最低レベルは構造体であり、オブジェクトではないと思いますか? - http://msdn.Microsoft.com/en-us/library/ms173109.aspx – rizzle
  • Int32はObjectから継承するValueTypeから継承しませんか?もしそうなら、振る舞いにもかかわらず、intはオブジェクトです。 –クリスファーマー
  • いいえ、intのボックス型は、Objectから継承するValueTypeから継承します。 a)intはintへの参照ではなく、IT ISint。b)intはガベージコレクションされないため、これらは従来の意味でのオブジェクトではありません。 Int32を宣言すると、そのintはスタック上で4バイトになり、話は終わりです– Binary Worrier

オブジェクトの定義:クラスSystem.Objectの継承者としての「Object」vs。タイプのインスタンスとしての「object」vs。参照型としての「object」。

48
missaghi

ここでの問題は、これが実際には2つの質問であるということです。1つの質問は継承に関するものであり、その場合の答えは「ほぼすべて」であり、もう1つの質問は参照型と値型/メモリ/ボクシングに関するものであり、この場合の答えは「いいえ」です。 "。

継承:

C#では、次のことが当てはまります。

  • 列挙型とnull許容型を含むすべての値型は、System.Objectから派生します。
  • すべてのクラス、配列、およびデリゲートタイプは、System.Objectから派生します。
  • インターフェイスタイプはSystem.Objectから派生していません。これらはすべてSystem.Objectに変換可能ですが、インターフェイスは他のインターフェイスタイプからのみ派生し、System.Objectはインターフェイスタイプではありません。
  • ポインタタイプはSystem.Objectから派生していません。また、それらのいずれもSystem.Objectに直接変換できません。
  • 「オープン」タイプのパラメータタイプもSystem.Objectから派生していません。タイプパラメータタイプは何からも派生していません。型引数は、有効な基本クラスから派生するように制約されていますが、それ自体は何からも「派生」していません。

From System.ObjectのMSDNエントリ

.NET Frameworkクラス階層内のすべてのクラスをサポートし、派生クラスに低レベルのサービスを提供します。これは、.NETFrameworkのすべてのクラスの究極の基本クラスです。これは、型階層のルートです。

継承は暗黙的であるため、言語は通常、オブジェクトからの継承を宣言するためにクラスを必要としません。

.NET FrameworkのすべてのクラスはObjectから派生しているため、Objectクラスで定義されているすべてのメソッドは、システム内のすべてのオブジェクトで使用できます。派生クラスは、これらのメソッドの一部をオーバーライドできます。

したがって、C#のすべての型がSystem.Objectから派生しているわけではありません。そして、それらのタイプであっても、 参照型値型 の違いは非常に異なるため、注意する必要があります。

ボクシング:

値型はSystem.Objectからinheritを実行しますが、メモリ内では参照型とは異なる方法で処理され、コード内のメソッドを介して渡される方法のセマンティクスは次のように異なります。上手。実際、値型は、参照型としてボックス化することによってアプリケーションに明示的に指示するまで、オブジェクト(参照型)として扱われません。 C#でのボクシングの詳細はこちら を参照してください。

79
Daniel Schaffer

パーティーに少し遅れましたが、SOの検索結果でこれに出くわし、以下のリンクが将来の世代に役立つと考えました。

Eric Lippert これについて非常に徹底的に議論します 、はるかに優れた(修飾された)ステートメント:

この神話を修正する方法は、単に「派生元」を「変換可能」に置き換え、ポインター型を無視することです。C#のすべての非ポインター型はオブジェクトに変換可能です。

その要点は、プログラミング言語を書く人々からのよく説明された説明を読むのが嫌いな場合、(ポインターは別として)、インターフェイスやジェネリックパラメーター型宣言( "T")のようなものはオブジェクトではないが、それらはオブジェクトになる明確なインスタンスを持っているため、実行時にオブジェクトとして扱うことができます。他のタイプ(Type、Enum、Delegate、classesなど)はすべてオブジェクトです。他の回答で説明されているように、オブジェクトにボックス化できる値型を含みます。

30
Matt Enright

ここの何人かの人々は、オブジェクト指向プログラミングの「オブジェクト」が何であるかについて奇妙な概念を持っています。何かがオブジェクトになるためには、それが行うnotは参照型であるか、より一般的には、正式な実装に従う必要があります。

つまり、オブジェクト指向の世界で一流の市民として操作できるということです。 can C#の値に対してこれを行うので(オートボクシングのおかげで)、すべてが実際にオブジェクトです。ある程度まで、これは関数にも当てはまります(ただし、おそらくクラスには当てはまりません)。

これが実際に関連するかどうかは別の質問ですが、これはOOPの一般的な問題であり、もう一度気づきます。OOP(はい、ほとんどの人は、それがポリモーフィズム、継承、カプセル化と関係があることに同意しています。

使用法の観点から、C#のすべての値はオブジェクトのように処理されます。そうは言っても、私は現在受け入れられている答えが好きです。それは技術的に重要な側面の両方を提供します。

他のコンテキストでは、たとえばC++は、必ずしもオブジェクト指向である必要はなく、さらに低レベルの側面に重点を置いているため、他の側面が強調されています。したがって、オブジェクト、POD、および組み込みプリミティブの区別が理にかなっている場合もあります(その場合も、そうでない場合もあります)。

16
Konrad Rudolph

それらはすべてオブジェクトとして扱われますがオブジェクトではありません。混乱はオートボクシングにあります。

詳細については、これを参照してください: http://en.wikipedia.org/wiki/Object_type

抽象化は明らかに人々を混乱させます。

7
GEOCHET

オブジェクトを値または参照と混同しています。基本的に、すべてがオブジェクトです。 Intはオブジェクトですが、値型でもあります。クラスインスタンスはオブジェクトですが、参照型でもあります。

メソッドはオブジェクトではなく、プロパティでもありません。オブジェクトを操作するだけです。そして、はい、ほとんどすべてがオブジェクトクラスから継承します。

6
BBetances

値型はオブジェクトではないと思いました。それらはCLRによってメモリに異なる方法で格納されます。値型はスタックに格納され、オブジェクトはヒープに格納されます。値型を参照型にキャストしてオブジェクトのように動作させることができますが、CLRは値をスタックから取り出し、オブジェクトにラップして、ヒープに格納します。これは、変数を「ボックス化」したときに発生することです。

6
Rich

C#(および一般的にOOP))には、型(class-reference、struct-valueなど)があります。これらは定義です。「オブジェクト」は、の具体的なインスタンスです。与えられたタイプ。

したがって、質問を文字通り読むと、はい、インスタンス化されるとすべてがオブジェクトになります。

混乱はおそらく、すべての基本クラスの名前の選択が間違っていることから始まります。 。NET では、これはObjectクラスです。

5
Sunny Milenov

差出人: 値型(C#リファレンス)-MSDN 3.5

すべての値型は、System.ValueTypeから暗黙的に派生します。

差出人: 値型クラス-MSDN 3.5

ValueTypeは、オブジェクトの仮想メソッドを、値型のより適切な実装でオーバーライドします。

差出人: 列挙型クラス-MSDN 3.5

このクラスはValueTypeを継承します

継承階層は次のとおりです。

  • System.Object
    • System.ValueType
      • System.Enum

結論:すべてがオブジェクトです

3
Gavin Miller

私が読んだすべての本に基づくと、C#のすべてがオブジェクトです。

いくつかは参照であり、他は値型です。値型オブジェクトはクラスから継承します ValueType 。それらは異なる動作をしますが、本質的に...オブジェクトです。

これが、Int32をオブジェクト変数に格納できる理由と、.NETで作成できるすべてのものを格納できる理由です。

詳細については...以下を参照してください。 http://msdn.Microsoft.com/en-us/library/s1ax56ch(VS.71).aspx

すべての値型は、Objectクラスから暗黙的に派生します。

3
Maxime Rouiller

誰もが値型と参照型の議論に焦点を当てているようですが、C#で参照でも値でもない、オブジェクトから派生していない、オブジェクトにキャストできない1つの型を忘れています:ポインタ。

値や参照型とは異なり、ポインタをオブジェクトにキャストすることはできません。

C#ポインタタイプに関するMSDNドキュメント によると、

ポインタ型はオブジェクトから継承せず、ポインタ型とオブジェクトの間に変換は存在しません。また、ボックス化とボックス化解除はポインタをサポートしていません。ただし、異なるポインタータイプ間、およびポインタータイプと整数タイプ間で変換できます。

「すべて」と「オブジェクトである」の意味によって異なります。これらの2つの用語を定義すると、答えは簡単です:-)

たとえば、一部の言語では、if-blockは、値として渡したり、変数に割り当てたりすることができるオブジェクトです。これはC#には当てはまらないため、明らかにすべてがC#のオブジェクトであるとは限りません。

2
JacquesB

値型はオブジェクトではなく、異なるコピーセマンティクス、異なる受け渡しセマンティクスに従い、そのように扱われるためにはクラス(オブジェクト)でラップする必要があります。

編集:「オブジェクト」の意味を修飾する必要があるため、議論はやや曖昧だと思います。オブジェクトはオブジェクトから継承するものですか、それともオブジェクトの使用セマンティクスに従うものですか?それとも、オブジェクトの最も一般的な定義について話していますか?それは、データとそのデータに対する操作を含むことができるものです。

0
Ron Warholic

番号2はオブジェクトではありません。

0
Joe Phillips

質問がOOPの意味でオブジェクトを参照していることを考えると、答えは次のとおりです。

技術的の観点から、答えは次のとおりです:いいえ

独断的の観点から、答えは次のとおりです:はい

説明:

技術的には、値型(プリミティブまたは構造体)は「ボックス化」形式でない限りオブジェクトではありませんが、.Netは、ボックス化/ボックス化解除(値を保持するクラスインスタンスを作成し、 Objectから派生)、つまり、値型はオブジェクトと単純な値の両方として扱うことができます。

したがって、値型は本質的に二重であり、およびオブジェクトとして動作します。 .Netの値は、必要な場合はオブジェクトであり、それ以外の場合はオブジェクトではありません。

技術的な側面を考慮した正解は、「。Netのすべてがあたかもオブジェクトである」です。

独断的な答えは「すべてがオブジェクトである」です。

0
Pop Catalin

これは、言語と記憶という2つの世界についての議論です。

私にとって、言語は抽象化レイヤーのようなものであり、オブジェクトという用語はこのレベルの抽象化に属します。記憶の構成という観点からオブジェクトについて話すことには意味がありません。メモリについて話すときに「オブジェクト」という用語を使用する場合、実際にはこの用語を別の抽象化レイヤーから借用しています。したがって、それがどこから来たのかを忘れてはなりません。

C#について話している場合、なぜ誰かがメモリ編成を引数として使用するのか理解できません。もちろん、この質問に誰かに答えるとしたら、「はい、C#ではすべてがオブジェクトですが、内部では、動作が異なる場合があることも知っておく必要があります。..」

これは興味深い議論を始めるかもしれませんが、一部の人にも話すかもしれません。同様の議論では、実際にはオブジェクト指向プログラミングはなく、手続き型プログラミングしかないということができます。 CPUはオブジェクトを理解していますか?さらに良いことに、実際にはソフトウェアはなく、ハードウェアの状態が異なるだけです:)

私のポイントは、いくつかの用語は他の抽象化レイヤーに翻訳されないので、それが属する場所(この場合はメモリではなく言語)に議論を固執する必要があるということです。

この質問の作成者でさえ、「この質問は、必ずしも.NETではなくC#を参照し、内部でデータを処理する方法を参照していることに注意してください(明らかにすべて1と0です)。」

0
Piotr Owsiak

C#は、統合型システムと呼ばれていました。つまり、すべてをオブジェクトとして見ることができます。ただし、この下には、値型と参照型の2つの異なる型があります。値型は、ボクシングメカニズムを介してオブジェクトとして表示できます。これは、問題の値型の値を表すオブジェクトが作成されることを意味します。

0
Brian Rasmussen

セマンティクスに対処するために、Wordの「オブジェクト」をオーバーロードして「参照型」を意味するようにする理由->「参照型」の完全に適切で明確な用語がある場合、および「オブジェクト」という単語をオーバーロードする場合このようにして、このスレッドが示す混乱を引き起こします...つまり、すべての型(値型を含む)が型「System.Object」で定義された実装を継承するという事実間の不一致。明らかに、これはせいぜい不必要であり、最悪の場合非常に混乱します。MSのドキュメントがこの問題について混乱している場合でも、混乱を広める言い訳にはなりません。

はるかに簡単で明確なのは、「オブジェクト」という用語を定義して使用し、任意の型、値、または参照のインスタンスを意味し、「参照型」というフレーズを使用して、ポインター変数を使用し、その状態を格納する型を説明することです。ヒープ.。

0
Charles Bretana