web-dev-qa-db-ja.com

Stringはプリミティブ型ですか?

文字列とプリミティブ型について興味があります。 this のような記事は、文字列がプリミティブ型であることを示しています。ただし、MSDNの 2番目の記事 は、文字列をプリミティブ型としてリストしません。

ただし、2番目の記事で提供されているコードを実行すると、String is Primitive typeと表示されます。

誰でも私にこれを案内できますか?

63
Ram

両方の記事は、文字列は[〜#〜] not [〜#〜]プリミティブ型であると述べています。そうではありません。

2番目の記事のサンプルコードをコンパイルして実行すると、次のように出力されます。

文字列はプリミティブ型ではありません。

これについての混乱は、新しい文字列を作成する構文が値型を作成することに似ていることだと思います。

値型を定義するとき、これらはすべて等しい(とにかく32ビットシステム上で)

System.Int32 a = new System.Int32(5);
System.Int32 a = 5;
int a = 5;

参照型文字列を作成するときのこれらのように:

System.String s = new System.String(new char[]{'h', 'e', 'l', 'l', 'o'});
System.String s = "hello";
string s = "hello";

また、文字列が参照型であっても値によって文字列を比較できます。

s == "hello";//true

これはまだ文字列をプリミティブ型にしません。

これに対する受け入れられた答え question はそれについての詳細を与えるはずです。

44
Fedearne

プリミティブ型とは何かという「Microsoft」の定義はありません。

特定のコンテキストにはプリミティブ型の定義のみがあります。

  • CLR は、プリミティブ型を次のもの以外のものとして定義します:
    • System.Boolean
    • System.Byte
    • System.SByte
    • System.Int16
    • System.UInt16
    • System.Int32
    • System.UInt32
    • System.Int64
    • System.UInt64
    • System.IntPtr
    • System.UIntPtr
    • System.Char
    • System.Double
    • System.Single
  • VB.NET仕様バージョン10(セクション7.3)では、「プリミティブ型」をその型のキーワードエイリアスを持つ型として定義しています(したがって、System名前空間をインポートせずにその型を使用できます)。そのタイプのインスタンスをリテラルで定義するため;これらの型を定数として使用できるようにします。 VB.NETのプリミティブ型は次のとおりです。
    • System.Byte
    • System.SByte
    • System.UInt16UShort
    • System.Int16Short
    • System.UInt32UInteger
    • System.Int32Integer
    • System.UInt64ULong
    • System.Int64Long
    • System.Single
    • System.Double
    • System.Decimal
    • System.Boolean
    • System.DateTimeDate
    • System.Char
    • System.String
  • C#仕様(バージョン4)では、一部の型のキーワードエイリアスを定義し、一部の値のリテラルを指定する方法も定義しています。また、定数式で使用できる型を個別に定義します。 C#の「プリミティブ型」に最も近い概念は、セクション4.1.4:単純型です。 (「プリミティブ」という単語は、600ページのドキュメントで2回だけ使用されます)。これらのプリミティブ型は、単に「C#でキーワードエイリアスを持つ値型」として定義されています-stringはそのセクションでは言及されていません。

    • System.SBytesbyte
    • System.Bytebyte
    • System.Int16short
    • System.UInt16ushort
    • System.Int32int
    • System.UInt32uint
    • System.Int64long
    • System.UInt64ulong
    • System.Charchar
    • System.Singlefloat
    • System.Doubledouble
    • System.Booleanbool
    • System.Decimaldecimal

これらのすべての間には部分的な重複しかないことがわかります。 CLRは両方のポインタータイプをプリミティブと見なし、VB.NETとC#の両方を10進数をプリミティブ/シンプルタイプと見なし、VB.NETのみがDateTimeを特別なものと見なします。VB.NETとC#の両方には、キーワードエイリアスと文字列のリテラル構文がありますただし、VB.NETのみがStringを「プリミティブ型」として指定しますが、C#にはその仕様のセクションにSystem.String...

結論として、「プリミティブ型」とは、コンテキストによって定義が異なることです。それは問題ではありません-あなたのプログラミング言語の使い方を学ぶだけで、そのような多態的な単語をめぐって戦い、考えても意味がありません。個人的に、なぜプロパティType.IsPrimitiveも存在します。

はどうかと言うと System.String

  • CLR:特別なことはありません。単なる参照型です。
  • VB.NET:これはプリミティブ型です。
  • C#:Stringは、独自の非常に特殊なスノーフレークです。
42
Jean Hominal

スタンスの変更の更新:コードが嘘をつかないのでいいえ

Console.WriteLine(typeof(string).IsPrimitive); => False
Console.WriteLine(typeof(int).IsPrimitive); => True

-----更新の終わり。
しかし、オンラインの一部のドキュメントでは、Stringをプリミティブとして扱っているようです。私は思うはい-「プリミティブ」の次の定義に基づいています。 (私の個人的な定義は、コンポーネントのタイプにさらに分解できないタイプになります。しかし、私たちはここで単に「独創的」であると思います、それは私にとってほとんど問題ではありません。)

c#のすべてのプリミティブデータ型は、System名前空間のオブジェクトです。データ型ごとに、短い名前またはエイリアスが提供されます。

ソース: http://msdn.Microsoft.com/en-us/library/ms228360%28VS.80%29.aspx 賛成の別の記事- MSDN Magの記事

要約:答えはプリミティブの定義に依存していると思いますが、これは明確に定義されていません。ソース: Eric Lippert on another SO thread。

10
Gishu

.NETの定義(記事から):

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

だから作り付けの非常に重要:はい、しかしプリミティブではありません。

VBは、CLIとC#に対して若干異なる定義を使用しているようです。

6
Marc Gravell

いいえ、文字列はプリミティブ型ではありません。

ただし、プリミティブ型に共通するいくつかの特性があります。

この言語はコード内の文字列リテラルをサポートしているため、文字列オブジェクトを取得するためにStringキーワードを使用してnewインスタンスを明示的に作成する必要はありません。

+演算子を使用して文字列を連結することもサポートされています。これは、コンパイラがString.Concatメソッドの呼び出しに変換します。

文字列は不変です。つまり、ほとんどの場合、文字列はプリミティブ型と同様に値型のセマンティクスを持っています。

3
Guffa

Microsoftの「プリミティブ」の定義では、文字列はプリミティブ型とは見なされません。一方、Microsoftは明確なまたは一貫した定義(「アンマネージリソース」など)を実際に定式化せずに用語を使用する傾向があり、「プリミティブ」を「ストリング」、「配列」、「オブジェクト」を含むように定義すると便利ですそれらが存在しない場合、それらを効率的にエミュレートできる型を定義する方法はありません。

3
supercat

文字列は特別なプリミティブ型です。これは値型ではありませんが、リテラル、たとえば「hello」を記述することで作成でき、型文字列の定数を宣言できるため、プリミティブ型と見なすことができます。そうは言っても、IsPrimitiveの値はfalseを返します。

Console.WriteLine("hello".GetType().IsPrimitive) // output = False

編集:ここで私の答えを取り戻したいです。技術的にはプリミティブ型ではありませんが、上記のプロパティを共有しています。

1
Tim Carter

C#では、型は主に値型とプリミティブ型の2つの型として定義されます。

最初に、C#のプリミティブ型の definition を参照してください。

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

さて、この記事の違いについて読んでください: Primitive Types&Value Types

System.Stringは、CLIのプリミティブ型である「string」にマップされます。 しかし、実際には、値型はヒープ領域ではなくスタックに格納されるものです。

そのため、キーはValue types vs Primitive typesです。 Microsoftのプリミティブの定義では、プリミティブ型ですが、より一般的な意味ではそうではありません。

1
zengr