79 votes

String est-il un type primitif?

Je suis curieux de connaître la chaîne et de type primitif. L'Article comme cela , dit-chaîne est de type primitif. Toutefois second article sur MSDN ne pas la liste de chaîne de type primitif.

Cependant quand j'ai couru le code fourni dans le deuxième article, il affiche la Chaîne n'est pas un type Primitif.

Quelqu'un peut-il me guider sur ce point?

Merci, Ram

55voto

Fedearne Points 1731

Les deux articles de dire que la chaîne n'est PAS un type primitif. Ce qui ne l'est pas.

Si vous compilez et exécutez l'exemple de code à partir du deuxième article, il serait d'impression:

la chaîne n'est pas un type primitif.

Je pense que la confusion à ce propos, c'est que la syntaxe de création d'une nouvelle chaîne est similaire à la création de types de valeur.

Lors de la définition d'un type de la valeur de tous ces sont égaux (sur un système 32 bits de toute façon)

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

Tout comme lors de la création d'une référence de type chaîne de caractères:

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

Aussi, nous pouvons comparer des chaînes par valeur, même s'ils sont des types référence:

s == "hello";//true

Cela ne fait toujours pas de chaîne un type primitif.

La accepté de répondre à cette question devrait vous donner plus de détails sur ce point.

53voto

Jean Hominal Points 7001

Il n'y a pas de "Microsoft" définition de ce qu'est un type primitif est.

Il y a seulement des définitions de types primitifs dans un contexte donné.

  • Le CLR définit les types primitifs comme n'étant rien de plus que:
    • Système.Boolean
    • Système.Octet
    • Système.SByte
    • Système.Int16
    • Système.UInt16
    • Système.Int32
    • Système.UInt32
    • Système.Int64
    • Système.UInt64
    • Système.IntPtr
    • Système.UIntPtr
    • Système.Char
    • Système.Double
    • Système.Unique
  • L'VB.NET spécification de la version 10 (section 7.3) définit les "types primitifs" comme étant des types qui ont un mot clé alias pour le type (permettant ainsi l'utilisation de ce type sans importer le "Système" de l'espace de noms), un moyen de définir les instances de ce type avec un littéral; et de permettre l'utilisation de ces types de constantes; les types primitifs dans VB.NET sont:
    • Système.Octet
    • Système.SByte
    • Système.UInt16 (UShort)
    • Système.Int16 (Court)
    • Système.UInt32 (En Uinteger)
    • Système.Int32 (Entier)
    • Système.UInt64 (ULong)
    • Système.Int64 (Long)
    • Système.Unique
    • Système.Double
    • Système.Décimal
    • Système.Boolean
    • Système.DateTime (Date)
    • Système.Char
    • Système.Chaîne
  • La spécification C# (version 4) définit le mot-clé alias pour certains types, et définit également la manière de spécifier des littéraux pour certaines valeurs; il définit aussi, séparément, les différents types sont disponibles dans des expressions constantes; le plus proche de la notion de "types primitifs" que le C# a est dans la section 4.1.4: les types Simples. (le mot "primitif" n'est utilisé que deux fois dans les 600 pages du document); ces types de primitives sont simplement définis comme des "types de valeur qui ont un mot clé alias en C#," - "chaîne" n'est pas mentionné dans la section:

    • Système.SByte (sbyte)
    • Système.Octet (byte)
    • Système.Int16 (court)
    • Système.UInt16 (ushort)
    • Système.Int32 (int)
    • Système.UInt32 (uint)
    • Système.Int64 (long)
    • Système.UInt64 (ulong)
    • Système.Char (char)
    • Système.Seul (float)
    • Système.Double (double)
    • Système.Booléen (bool)
    • Système.Décimal (virgule)

Vous verrez que il y a seulement un chevauchement partiel entre toutes ces choses; le CLR voit les deux types de pointeur comme primitive, à la fois VB.NET et C# voir décimal comme un primitif/type simple, seulement VB.NET voit DateTime comme quelque chose de spécial, à la fois VB.NET et C# un mot clé alias et une syntaxe littérale pour les chaînes de caractères, mais seulement VB.NET spécifie la Chaîne "string" comme étant un "type primitif", tandis que le C# n'a tout simplement une section de son cahier des charges dédié à la Système de.Chaîne de...

En conclusion: des contextes différents ont différentes définitions de ce qu'est un "type primitif" est. Il n'a pas d'importance - il suffit de savoir comment utiliser votre langage de programmation, il n'y a pas de sens dans la lutte contre et la réflexion sur ces polymorphes mots. Personnellement, je me demande pourquoi la propriété "Type.IsPrimitive" existe même.

Comme pour le Système.Chaîne de caractères:

  • CLR: Rien de spécial, c'est juste un type de référence;
  • VB.NET: C'est un type primitif;
  • C#: Chaîne de caractères est un très spécial de flocon de neige;

9voto

Gishu Points 59012

Le changement de position de mise à Jour: Pas parce que le code ne ment pas

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

-----fin de la mise à jour.
Mais une partie de la documentation en ligne semble traite la Chaîne comme un primitif. Je pense que Oui - basée sur la définition suivante de "primitifs". (Ma définition personnelle serait un type qui ne peuvent pas être ventilés en types de composant. Mais je suppose que nous sommes juste être "pédant" ici, c'est un non-problème pour moi la plupart du temps.)

tous les types de données primitifs en C# sont les objets dans l'espace de noms System. Pour chaque type de données, un nom court, ou alias, est fourni.

Source: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx Un autre article en faveur - MSDN Mag de l'article

Résumé: je suppose que la réponse dépend de votre définition de primitives, qui n'est pas sans ambiguïté. Source: Eric Lippert sur un autre fil.

5voto

Marc Gravell Points 482669

.NET définit (à partir de votre article):

Les types primitifs sont Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Char, Double et Single.

Donc non. Intégré et très important: oui, mais pas primitif.

VB utilise une définition légèrement différente de la CLI et C # semble-t-il.

4voto

supercat Points 25534

Selon la définition de "primitive" de Microsoft, chaîne n'est pas considérée comme un type primitif. D'autre part, Microsoft a tendance à utiliser la terminologie sans réellement formuler de définition claire et cohérente (par exemple, "ressource non gérée"), et il serait utile de définir "primitive" comme "String", "Array" et "Object", en leur absence, il n'y aurait aucun moyen de définir des types qui pourraient les imiter efficacement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X