8

私は、JavaとC#での「プリミティブ」の使用と、それらの違い(存在する場合)を理解しようとしています。私はSOについて一連の質問をしましたが、いくつかの回答は問題を明確にするのではなく混乱させるようです。いくつかの回答(およびいくつかのMSドキュメント)は矛盾したステートメントを提供しているように見えます。SOから

およびMSから:http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx- 「構造体はクラスに非常に似ています」-「クラスはデータ型をInt32ラップします」- int「一方、C#のすべてのプリミティブデータ型はSystem名前空間のオブジェクトです。データ型ごとに、短い名前またはエイリアスが提供されます。たとえば、intはSystem.Int32の短い名前です。」

私の混乱は主にC#にあります(私はしばらくの間Javaをプログラムしました)。

編集次の段落は@JonSkeetによって正しいことが確認されています

  • Javaには2つのタイプ(プリミティブとクラス)があります。「値型」という言葉は、プリミティブ(広く使用されていませんが)の同義語であり、クラスの「参照型」である可能性があります。Javaはプリミティブ(int)をクラス(整数)に「ラップ」し、これらのクラスは他のクラスの完全な能力を備えています(null、コレクションで使用など)

編集@JonはC#について非常に明確な声明を出しているので、提案された真実を削除して彼の答えを参照します。

さらなる質問:これらの用語の実際の使用法についてのコンセンサスはありますか?コンセンサスがあれば、それが明確に説明されていることに非常に感謝します。それ以外の場合は、用語が混乱しているため、使用が制限されていると思います。

まとめ非常に明確な回答をありがとうございます。これを本当に理解している人々の間にはコンセンサスがあり(@Jonからの受け入れられた回答を参照)、MSドキュメントは一貫しています(ただし、場所によってはJavaを参照しており、C#と誤解しています)

4

2 に答える 2

13

私はMSドキュメントがこれについて矛盾しているのを見たことがありません(MSDNが間違っていることもありますが、この特定の問題については、常に正しいと思っています)。あなたが投稿したMSDNリンクには次のように書かれています。

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

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

基本的に、それは正しいことを言っています。Javaでは、Integerクラスはintプリミティブ型のラッパーです。C#では、intは構造体のエイリアスですSystem.Int32。最初の段落はJavaに関するものであり、C#には適用されません。


.NETでは、用語は次のとおりです。

プリミティブ型は、IsPrimitiveプロパティがtrueに設定されている型です。プリミティブ型は次のとおりです。

プリミティブ型は、ブール、バイト、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double、およびSingleです。

すべてのプリミティブ型は値型ですが、その逆はありません

値型は、参照セマンティクスとは対照的に、値セマンティクスを持つ型です。値が渡されると、値全体がコピーされます(参照ではありません)。値型のローカル変数はスタックに格納されます。structsと enumsは値型です。

上記のように、すべてのプリミティブ型は値型です。それらは名前空間struct内にあります。SystemC#int、、doubleなどでは、キーワードは基本的にそれらstructのエイリアスです。

于 2009-10-21T09:09:47.207 に答える
13

最初の箇条書きは正しいです。

2つ目はそうではありません。.NETのプリミティブ型は、ブール、バイト、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double、およびSingleです。通常、構造体をに設定することはできませんnullが、null許容値型(Nullable<T>)もあります。これらはまだ値型ですが、C#には、「null」を「型のnull値」と同等にする構文糖衣があります。これは、null許容値型の場合HasValueはfalseを返すインスタンスです。

intSystem.Int32 C#の正確な同義語です。前者は後者の単なる別名です。それらはまったく同じコードにコンパイルされます。

C#では、クラスとインターフェイスは常に参照型です。構造体と列挙型は値型ですが、すべての構造体に相当するボックス化されたものがあります(それ以外は、ボックス化Nullable<T>に関してCLRによって異なる方法で処理されます)。ボックス化された型には個別の名前がなく、C#で明示的に参照することはできません(ただし、C ++ / CLIでは参照できます)。.NETのような別個のラッパークラスはありません。java.lang.IntegerJavaとは異なり、.NETで独自の値型を作成できるため、このようなクラスを導入するのは問題があります。

参照型と値型の詳細については、それに関する私の記事を参照してください。

于 2009-10-21T09:14:30.987 に答える