12

今日の初めの議論で、私はプリミティブとリテラルの理解が正しいかどうか疑問に思いました。


私の理解では、リテラル型は具体的には、特定の型宣言なしで人間とコンパイラの両方が理解できる表記法を使用して値を割り当てることができる型です。

var firstName = "John"; // "John" is literal

var firstName = (string)"John"; // *if* the compiler didn't understand that "John"
                                // was a literal representation of a string then I
                                // would have to direct it as such

プリミティブについての私の理解は、それらが本質的にコンパイラが理解できる要素データ型であるということです。たとえば、int:

int age = 25;

... VB9によるXMLリテラルのサポートなど、リテラルは非プリミティブである可能性があります。非現実的な例は、System.Drawing.Pointにリテラルを割り当てることができる場合です。

Point somePoint = 2,2; // both X and Y are primitive values, however Point is a
                       // composite value comprised of two primitive values

最後に(そしてこれが私に上記の質問をするように導いた質問です):私の理解は、型がプリミティブであるかリテラルであるかは、それが値型であるか参照型であるかとは直接関係がないということです。

たとえば、System.Stringは、リテラルをサポートする参照型です。カスタム定義の構造体は、リテラルをサポートしない複合値タイプです。

私の理解(私の説明ではないにしても)はほとんどの部分で正しいですか?


更新:素晴らしい情報と会話をありがとう!これを見つけた人は、コメントと回答を必ず読んでください。いくつかの優れた説明といくつかの興味深いサイドノートがあります。

ところで:それは、大きな緑色のチェックを取得するのに本当に値する答えの間のトスアップです。残念ながら、まともな回答だけでなく、コメントスレッドに多くの説明と情報が含まれている、反対意見の回答にそれを与えています。公平を期すために、ここに最良の答えは1つではなく、少なくとも3つあります:)

4

8 に答える 8

16

ここに簡単なメモを挿入したかっただけです。

C#言語仕様では、「リテラル」が明確に定義されています。リテラルは、値のソースコード表現です。リテラルは、、、、、およびnullのようなものtrueであり10特定の値を表すテキストです。5.7'c'"hello"

C#言語仕様では、「プリミティブ」という単語を2回使用しています。それは決して定義されておらず、それが何を意味するのかについて完全に曖昧です。

C#言語仕様では、「プリミティブ」という単語を使用または定義する必要がないため、このあいまいな用語を使用しないでください。私はMadsと話をしましたが、この使用法を完全に排除するために、仕様の将来のエディションが書き直されることに同意しました。

他の型システムの仕様(リフレクションライブラリ、CLI、VESなど)が「プリミティブ」という言葉をどのように定義するかは、もちろんそれら次第です。

質問をしてくれてありがとう。

于 2010-01-25T19:51:15.670 に答える
3

はい、リテラルはソースコードで表現された値です。したがって、VBは日付/時刻とXMLリテラルをサポートしていますが、C#はサポートしていません。

C#仕様のセクション2.4.4から:

リテラルは、値のソースコード表現です。

あなたが言うように、これは値型と参照型とは無関係です-文字列は確かに参照型です。

ちなみにまだ誰も言及していない文字通りnull...

また、プリミティブ型とは無関係です-from Type.IsPrimitive

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

... C#仕様は、実際には「プリミティブ」タイプの概念を定義していませんがString、上記のリストには含まれていないことに注意してください。

リテラルがコンパイル時定数であるという点で...C#では、すべてのリテラルには、アセンブリに直接ベイクできる表現があります。const DateTimeVBの余分なリテラルは、CLRが理解するように定数ではないことを意味します(たとえば、持つことはできません)が、それでもリテラルです。

于 2010-01-14T19:24:14.213 に答える
3

私の理解(私の説明ではないにしても)はほとんどの部分で正しいですか?

私はある点で同意しません:リテラルはある種のコンパイル時定数(、、"Hello World"または5'A'です。ただし、「リテラルタイプ」はありません。リテラルは常に実際の値です。

プリミティブ型は、string、int、double、float、short、...などのIMOの「基本」型です。

したがって、プリミティブには、それらのタイプのリテラルが接続されています。

于 2010-01-14T17:20:58.407 に答える
1

これは、プリミティブ型として文字列を含むCLSについて説明しているMSDNページです。

.NET Frameworkクラスライブラリには、コンパイラが使用するプリミティブデータ型に対応する型が含まれています。これらのタイプのうち、次のものはCLSに準拠しています:Byte、Int16、Int32、Int64、Single、Double、Boolean、Char、Decimal、IntPtr、およびString。これらの型の詳細については、.NETFrameworkクラスライブラリの概要の型の表を参照してください。

于 2010-01-17T03:27:07.127 に答える
0

あなたが言及しなかったことの1つは、スペースと割り当てだと思います。プリミティブは値型であり、前述の文字列型(文字列クラスがヒープにスペースを割り当てる)を除いて、(オブジェクトに関連付けられていない限り)スタックに割り当てられます。

オブジェクト自体にはプリミティブが含まれていますが、実際のオブジェクトが割り当てられる場所、つまりヒープ上にストレージが存在します。

それ以外は、あなたの声明はかなりよく書かれています。私が見逃した特定の質問がありますか:)?

于 2010-01-14T17:23:42.160 に答える
0

ASP.NetLiteralクラスも存在することを忘れないでください。

編集:したがって、同じ機能を提供する「プリミティブ」クラスがないため、タイトルの質問に対する答えはノーです。ただし、これは少し賢いアレック応答と見なすことができます。

于 2010-01-14T17:55:35.670 に答える
0

あなたの理解はほとんど正しいと思います。winSharp93が言ったように、リテラルはそれ自体が型を持つ値ですが、「リテラル型」のようなものはありません。つまり、文字列リテラルを使用できますが、文字列は「リテラル型」ではありません。ご想像のとおり、リテラルを定義するのは、値をソースコードに直接書き留めることですが、タイプを指定する必要がないという要件は非常に厳格に見えます(たとえば、F#には配列リテラルがあり、配列リテラルのタイプを推測できます)。[| 1; 2; 3 |]、ただし、必ずしも空の配列リテラルのタイプを推測できるとは限りません[| |])。

残念ながら、原始的なものを作るものについてよく合意された定義があるとは思いません。確かに、Jon Skeetが指摘しているように、CLRには、文字列を除外する独自のプリミティブ性(Type.IsPrimitive)の定義があります。ただし、他の信頼できるソースでは、 C#内のプリミティブ型であると見なされstringています。C#には、連結のための演算子の使用や、参照の等式ではなく値の等式objectとしての使用などの文字列のサポートが組み込まれているため、この定義が好きです。また、文字列の型を参照できるという事実もあります。フルネームを使用するのではなく、短い形式を使用すること。+==stringSystem.String

于 2010-01-14T21:50:57.613 に答える
0

さらに、制限を曖昧にする別の型があります。その値はC#言語ではリテラルSystem.Decimalとして表現できますが、 .Netプリミティブ型ではありません。

IMHOプリミティブ型は、基礎となるすべてのプラットフォーム/ホストに直接「存在する」型として簡単に定義できます。アセンブリ言語で既に遊んだことがある場合は、バイト、ワード、ダブルワードがあることを知っていますが、文字列はありません。または小数。

実際、 .Netの小数は.Netランタイムによって「エミュレート」され、 IEEE 754浮動小数点数(浮動小数点数と倍精度浮動小数点数はプリミティブ型)のみを理解するハードウェアによって直接処理されません。

リテラル値の概念を拡張することにより、「リテラルタイプ」は、値を特定の言語(C#、VB.Net、CIL ...)で直接表現できる任意のタイプと見なすことができます。この定義では、リテラル型は次のようになります。すべてのプリミティブ型+文字列+小数

于 2014-05-06T10:00:25.887 に答える