型システムとデータ型とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > 型システムとデータ型の意味・解説 

型システムとデータ型

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/17 21:54 UTC 版)

C SharpとJavaの比較」の記事における「型システムとデータ型」の解説

Javaには大別して参照型クラス型)とプリミティブ型基本型)が存在する参照型はjava.lang.Objectクラスから派生するが、プリミティブ型スーパークラス持たない一方C#には大別して参照型値型ポインタ型存在するこのうちポインタ型除きあらゆる型はすべてSystem.Objectクラスから派生するクラス (class) は参照型であり、数値型論理型を含む構造体 (struct) および列挙型 (enum) は抽象クラスSystem.ValueTypeから暗黙的に派生する値型である。 Java組み込み型 (built-in type) はプリミティブ型呼ばれるC#組み込み型をJavaよりも多く持ちすべての組み込み型はSystem名前空間存在する型へのエイリアスである。組み込み型には以下のようなものがある。 整数型: Javaには符号付き整数のみをサポートし符号なし整数存在しないC#では符号付き整数符号なし整数両方サポートする浮動小数点数型: いずれの言語IEEE 754準拠32bit単精度浮動小数点数64bit倍精度浮動小数点数を持つ。 C#ではさらに、10累乗の形で指数部を表す浮動小数点数であるdecimal型をサポートするdecimal型は値型かつ組み込み型であるが、CLRプリミティブではない。 文字型: いずれの言語UTF-16ベース文字型を持つ。 ブーリアン型: いずれの言語もtrue/falseのいずれかを表すブーリアン型を持つ。 オブジェクト型: C#では組み込み型としてobject型を持つ。Javaオブジェクト型java.lang.Objectは組み込み型ではない。 文字列型: C#では組み込み型としてstring型を持つ。Java文字列型java.lang.Stringは組み込み型ではない。 文字列はいずれ言語においても不変 (immutable) なオブジェクトとして扱われるが、特殊な構築方法として文字列リテラル利用することができる。C#ではエスケープ文字処理しないような逐語的文字列リテラルverbatim文字列: ヒアドキュメント参照)をサポートするC#言語自体にはプリミティブ型という用語は存在しないが、.NET Framework共通言語ランタイム (CLR) では、System.Type.IsPrimitiveプロパティによって、型がCLRプリミティブ型であるかどうか判定できる.NET言語組み込み値型は必ずしもCLRプリミティブ型ではないが、CLRプリミティブ型はすべて値型である。 いずれの言語プリミティブ型もしくは値型)と参照型との間で変換するためにボックス化 (boxing) とボックス化解除 (unboxing) が可能である。これによってプリミティブ型もしくは値型)は参照型サブセットとみなすことができる。値型仮想メソッドテーブル持たず、したがってそのままでは多態性利用できないが、C#においてはボックス化によって値型多態性利用することが可能である(例えobject型のToString()メソッドオーバーライドすることができる)。C#では数値リテラルオブジェクトであり、たとえば42.ToString()のようにint型リテラルからメソッド呼び出すことも可能である。Javaではこのような用途のためにプリミティブ型ラップするクラス別に定義される。すなわち、42.toString()のようなインスタンスメソッド呼び出しでなくInteger.toString(42)のような静的メソッド呼び出し必要になるもう一つ相違点として、Javaではジェネリクスにおいてこのような型を多用するため、暗黙的なボックス化解除可能になっている(C#ではボックス化せずにジェネリクス利用できる)。このような変換nullポインタ例外発生する可能性があるが、Javaではそれがコード上で明白ではない。 C#では、structキーワードによって構造体定義することができる。構造体にはフィールドメソッドプロパティなどの任意のメンバー定義できる引数持たないデフォルトコンストラクタプログラマ定義することはできないが、一つ上の引数をもつパラメータ化されたコンストラクタ定義することはできる。デフォルトコンストラクタすべてのメンバー各々既定値通例ゼロ当の値)で初期化する。また構造体定義する際、メンバーのメモリレイアウトを属性によって細かく制御することができるため、P/Invokeなどによるネイティブコードとの相互運用にも便利である。また、構造体継承元となる基底型を指定することはできず、派生型定義することもできない。ただし任意のインターフェイス実装は可能である。Javaには構造体存在せずユーザー定義の値型作成することはできないC#列挙型抽象クラスSystem.Enumから暗黙的に派生する値型一種であり、組み込み整数型ベースとしている。ベースとなる整数型のどの値も列挙型の値として有効になる明示的なキャストは必要であるが)。このため、ビットフラグにおいてビットごとのOR演算列挙型の値を組み合わせることが可能である。ただし構造体違って任意のインターフェイス実装することはできない一方Java列挙型抽象クラスjava.lang.Enumから暗黙的に派生する参照型である。Java列挙型として有効な値は定義においてリストされたものだけである。列挙型の値を組み合わせるためには列挙セットクラスを使用する必要があるJava列挙型では、値によって異なメソッド実装が可能である。JavaC#はいずれ列挙型文字列変換することができるが、Javaにおいてはこの変換カスタマイズすることができる。また、Java列挙型任意のインターフェイス実装することができる。 プリミティブ型(あるいは値型)は参照型クラス)とは異なりインスタンスヒープ領域ではなくスタック置かれるまた、フィールドとして、あるいはボックス化された状態で)クラス一部になることも、配列要素になることも可能である。クラスインスタンスメモリ上で間接的に参照される必要があるが、プリミティブ型(あるいは値型)はその必要がないプログラマ視点からは、C#値型軽量なクラスとみなせる。しかし、プリミティブ型(あるいは値型)には前述のように多数制限がある。値型通常nullの値をとることができないが、.NET Framework 2.0null許容型 (System.Nullable) が導入されC#でも擬似的null値取り得値型利用可能となった。 型そのものコード上で表現するメタデータ型(メタクラス)として、Javaではjava.lang.Classを、C#ではSystem.Typeを利用する。これらはいずれリフレクションイントロスペクション重要な役割を果たす

※この「型システムとデータ型」の解説は、「C SharpとJavaの比較」の解説の一部です。
「型システムとデータ型」を含む「C SharpとJavaの比較」の記事については、「C SharpとJavaの比較」の概要を参照ください。

ウィキペディア小見出し辞書の「型システムとデータ型」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「型システムとデータ型」の関連用語

型システムとデータ型のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



型システムとデータ型のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのC SharpとJavaの比較 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2024 GRAS Group, Inc.RSS