クライアントまで、フルのC#、"プリミティブ"と"文字通りの"交換用手首?
-
20-09-2019 - |
質問
議論の今につながっているかという疑問は私の理解primtives、リテラルに通知するものとします。
私の理解では、リテラルタイプでは、具体的にタイプを組むことができる値を表記する人材コンパイラが理解できな特定の型の宣言:
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の文字列.非現実の世界をすることができます。画します。きの割当てをリテラル:
Point somePoint = 2,2; // both X and Y are primitive values, however Point is a
// composite value comprised of two primitive values
最後の質問をいい、上記の問題):私の理解であるかどうかがプリミティブ型または文字通りに直接関連するかどうかは、価値または参照タイプです。
例えば、システム。文字列が参照型に対応しの文字列.ダイアログボックスが表示され構造は複合値の種類に対応していない文字列.
私の理解でない場合は私の説明不正のための最もできます。
更新: 謝のための情報や会話を!誰にも発見はこれについて"を必ずご確認くださいコメントなどの回答があり明確化の広がりの中など、いくつかの興味深い側です。
ちなみ:このtoss-upとする回答である"と呼ぶにふさわしい、大きな緑のチェック。んので、残念ながらdownvoted答えるだけでも回答が多くの明確化と情報のコメント。する公正かつベストな答えがここにある少なくとも三:)
解決
私はあなたが言及しなかった一つのことは、スペースと割り当てであると思います。プリミティブが値型であり、(それらはオブジェクトに関連付けられていない限り)あなたが述べたように、文字列型以外のスタックに割り当てられます(文字列クラスはヒープ上の領域を割り当て)。
は、オブジェクトが、自身が記憶装置が実際のオブジェクトはヒープ上にある、割り当てられている場合が存在するプリミティブを含む。
あなたの文はかなりよく書かれているし、その他。私は逃した具体的な質問を持っていますか?)
他のヒント
私はちょうどここに簡単なメモを注入したかっます。
C#言語仕様では、明らかに「リテラル」を定義 - リテラル値ののソースコードです。リテラルはtrue
、10
、5.7
、'c'
、"hello"
とヌルのようなものです - 。彼らはのテキストのあるの特定の値のを表している。
C#言語仕様は、「原始的」という言葉を二回使用しています。それは決して定義されていないと、それはおそらく意味するかもしれないものにのように完全にあいまいです。
C#言語の仕様では、このあいまいな用語の使用を作るべきではありませんので、使用したり、単語「プリミティブ」を定義し、する必要がありません。私はマッズとの話がありましたし、我々は仕様の将来の版は完全にこの使用を排除するために言い換えされることに合意しました。
どのように他のタイプのシステム仕様 - ように反射ライブラリ、CLI、VES、および - 単語の定義「プリミティブは、」彼ら次第もちろんです。
問題を持ち出してくれてありがとう。
ほとんどの部分は(そうでない場合は私の説明)正しい私の理解ですか?
私は1つの点で一致していません。
リテラルは("Hello World"
、5
又は'A'
など)コンパイル時定数のいくつかの種類です。しかし、「リテラル・タイプは、」存在しません。リテラルは、常に実際の値です。
プリミティブ型IMO文字列、int型、ダブル、フロート、短い、などの "基本的な" タイプです...
だから、プリミティブそれらに接続リテラルの彼らの種類を持っています。
はい、リテラルは、ソースコードで表される値です。
C#の仕様からは、セクション2.4.4ます:
あなたが言うように、A リテラルのソースコードであります 値の表現。
、これは参照型対値型とは無関係です - 文字列は、実際に参照型である
。 誰が言及していない、まだそれは仕方によってnull
リテラルワン...
また、プリミティブ型とは無関係のだ - から Type.IsPrimitive
:
プリミティブ型は、ブールあり、バイト、 SByte、Int16型、UInt16型、のInt32、UInt32型、 Int64型、UInt64型、のIntPtr、UIntPtr、シャア、 ダブル、シングルます。
... C#の仕様は、実際には「プリミティブ」タイプのアイデアを定義し、それString
は、上記のリストにない注意しません。
コンパイル時定数であるリテラルの観点... C#ですべてのリテラルは、アセンブリに直接焼成することができる表現を有します。あなたは、例えばconst DateTime
を持つことができない - - VB内の余分なリテラルは、CLRがそれらを理解するであろうと、彼らは定数じゃないわけ。彼らはまだリテラルです。
こちらの は、MSDNのページで話したCLS含まれる場合に適用され 文字列 としてのプリミティブ型:
きます。NET Frameworkのクラスライブラリ を含むタイプに対応 プリミティブデータの種類コンパイラ 利用します。これらの種類の CLS対応:バイトInt16,Int32, Int64、シングル、ダブル、Boolean、Char、 小数,IntPtr、文字列になります。詳 情報をこれらの種類は、 テーブルの種類です。NETフレームワーククラス 図書館に概説する。
も<のhref = "http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.literal.aspx" のrel = "nofollowをnoreferrerを" 存在が忘れてはいけません> ASP.Netクラスリテラルでます。
EDIT:同じ機能を提供し、「プリミティブ」クラスがないとしてこのように、タイトルに質問に対する答えは、ノーです。これは、しかし、スマートアレック応答のビットと見なすことができます。
私はあなたの理解はほとんどが正しいことだと思います。 winSharp93が言ったように、リテラルは自身が型を持つ値ですが、「リテラルタイプ」のようなものはありません。つまり、文字列リテラルを持つことができますが、文字列は「リテラルタイプ」ではありません、です。あなたが推測したように何種類を指定する必要はありません、あなたの要件が過度に厳しいようですが、どのようなリテラルを定義すると、(、値を直接ソースコードにダウン書かれていることである例えば、F#が配列リテラルを持ち、かつ配列リテラルの型を推論することができます[| 1; 2; 3 |]
、必ずしも空の配列リテラル[| |]
の種類を推測することはできません)。
残念ながら、私はよく合意されたプリミティブするものの定義はないと思います。ジョンスキートが指摘するように確かに、CLRは、文字列を除外原始(Type.IsPrimitive
)、独自の定義を持っています。しかし、他の信頼できるソースはstring
とさえobject
がプリミティブ型であると考えてこのC#の内。そこには、ビルトインされているためサポートC#で、このような連結のための+
演算子の使用と価値の平等ではなく、参照の等価として==
の使用だけでなく、文字列型ができるという事実のように文字列のために私は、この定義を好みますショートフォームstring
を使用してではなく、完全な名前System.String
を使用することと呼ばれる。
るだけで追加することがありうる曖昧にし、制限: System.Decimal
その値として表現することができ リテラル の C# 言語ができない .ネプリミティブ型.
まぁ プリミティブ型 が、簡単に言うと、種類を直接"が存在し、裏付 platform/host:だいたアッセンブリ言語を知っていますバイト、言葉、言葉を---ができない文字列である.
実際 .純部で"年"、小数部で" ている"エミュレーション"よります。純runtimeが直接扱うハードウェアのみを理解し IEEE754 浮動小数点数(floatおよびdouble値をプリミティブ型).
による拡張概念のリテラル値 "文字の種類" っていると考えられるでし任意の型の値を直接表現した言語(C#、VB.Net、CIL...).この定義の文字種をすることはできない。 すべてのプリミティブ型+の文字列+部で"年"、小数部で".