Est-ce que String est un type primitif?

je suis curieux au sujet de la corde et les types primitifs. Article comme ce dit chaîne de caractères est de type primitif. Cependant second article sur MSDN ne Liste pas la chaîne comme type primitif.

cependant quand j'ai couru le code fourni dans le deuxième article, il affiche chaîne de caractères n'est pas le type primitif .

quelqu'un Peut-il me guider?

61
demandé sur vaxquis 2010-10-19 10:13:36

9 réponses

les deux articles disent que la chaîne est et non un type primitif. Ce qui ne l'est pas.

si vous compilez et exécutez le code d'exemple à partir du second article, il afficherait:

chaîne n'est pas un type primitif.

je pense que la confusion à ce sujet est que la syntaxe de la création d'une nouvelle chaîne de caractères est similaire à la création de types de valeur.

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

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

comme ceux-ci lors de la création d'une chaîne de type de référence:

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

nous pouvons aussi comparer les chaînes de caractères par leur valeur même si ce sont des types de référence:

s == "hello";//true

cela ne fait pas encore de la chaîne un type primitif.

la réponse acceptée à cette question devrait vous donner des détails à ce sujet.

41
répondu Fedearne 2017-05-23 10:31:00

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

il n'y a que des définitions de types primitifs dans un contexte donné.

  • le CLR définit les types primitifs comme n'étant rien de plus que:
    • System.Boolean
    • System.Byte
    • System.SByte
    • System.Int16
    • spécification version 10 (dans la 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 l'espace de nom System ), une façon de définir les instances de ce type avec un littéral; et permettant l'utilisation de ces types comme constantes; les types primitifs dans VB.NET sont:
      • System.Byte
      • System.SByte
      • System.UInt16 ( UShort )
      • System.Int16 ( Short )
      • System.UInt32 ( UInteger )
      • System.Int32 ( Integer )
      • System.UInt64 ( ULong )
      • System.Int64 ( Long )
      • System.Single
      • System.Double
      • System.Decimal
      • System.Boolean
      • System.DateTime ( Date )
      • System.Char
      • System.String
    • la spécification C# (version 4) définit les alias de mots clés pour certains types, et définit également la façon de spécifier des caractères littéraux pour certaines valeurs; elle définit également, séparément, quels types sont disponibles en expressions constantes; le concept le plus proche des "types primitifs" que C# A est dans la section 4.1.4: types simples. (le le mot "primitive" n'est utilisé que deux fois dans le document de 600 pages); ces types primitifs sont simplement définis comme des "types de valeurs qui ont un nom d'alias en C#" - string n'est pas mentionné dans cette section:

      • System.SByte ( sbyte )
      • System.Byte ( byte )
      • System.Int16 ( short )
      • System.UInt16 ( ushort )
      • System.Int32 ( int )
      • System.UInt32 ( uint )
      • System.Int64 ( long )
      • System.UInt64 ( ulong )
      • System.Char ( char )
      • System.Single ( float )
      • System.Double ( double )
      • System.Boolean ( bool )
      • System.Decimal ( decimal )

    vous verrez qu'il n'y a qu'un chevauchement partiel entre toutes ces choses; le CLR voit les deux types de pointeurs comme primitifs, à la fois VB.NET et C# voir décimal comme un type primitif / simple, seulement VB.NET considère DateTime comme quelque chose de spécial, à la fois VB.NET et C # ont un alias de mot clé et une syntaxe littérale pour les chaînes mais seulement VB.NET spécifie String comme étant un "type primitif", tandis que C# a simplement une section de sa spécification dédié à System.String ...

    en conclusion: différents contextes ont des définitions différentes de ce qu'est un" type primitif". Cela n'a pas d'importance - il suffit d'apprendre à utiliser votre langage de programmation, il n'y a aucun sens à se battre et à penser sur ces mots polymorphes. Personnellement, je me demande pourquoi la propriété Type.IsPrimitive existe.

    comme pour System.String :

    • CLR: rien de spécial, c'est juste un type de référence;
    • VB.NET: c'est un type primitif;
    • C#: String est sa propre très spécial de flocon de neige;
39
répondu Jean Hominal 2015-04-21 21:46:36

mise à jour de changement de position: non car le code ne ment pas

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

-----fin de la mise à jour.

Mais certains documents en ligne semblent traiter String comme une primitive. Je pense que Oui - basé sur la définition suivante de "primitif". (Ma définition personnelle serait un type qui ne peut pas être décomposé plus en types de composants. Mais je suppose que nous sommes juste "pédants" ici, c'est un non-problème pour moi la plupart du temps.)

tous les types de données primitives 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 article

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

9
répondu Gishu 2017-05-23 10:31:00

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

les types primitifs sont booléen, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Char, Double, et simple.

donc non. Inbuilt et très important: Oui, mais pas un primitif.

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

5
répondu Marc Gravell 2010-10-19 06:21:09

selon la définition de" primitif " de Microsoft, string n'est pas considéré comme un type primitif. D'un autre côté, Microsoft a tendance à utiliser la terminologie sans vraiment formuler une définition claire ou cohérente (par exemple "ressource non gérée"), et on pourrait utilement définir "primitif" pour inclure "chaîne", "tableau", et "objet", car en leur absence il n'y aurait aucun moyen de définir des types qui pourraient les émuler efficacement.

3
répondu supercat 2012-06-27 20:40:39

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

cependant, il a certaines caractéristiques communes avec les types primitifs.

le langage prend en charge les caractères alphabétiques des chaînes de caractères dans le code, de sorte que vous n'avez pas à créer explicitement des instances String en utilisant le mot-clé new pour obtenir un objet string.

il y a aussi le support pour concaténer les chaînes en utilisant l'opérateur + , que le compilateur transforme en appel à la méthode String.Concat .

les chaînes sont immuables, ce qui signifie que dans la plupart des situations il a une sémantique de type valeur, tout comme les types primitifs.

2
répondu Guffa 2010-10-19 06:27:42

chaîne est un type primitif spécial. Ce n'est pas un type de valeur, mais peut être considéré comme un type primitif parce qu'il peut être créé en écrivant littérales, par exemple "hello" et il est possible de déclarer une constante de chaîne de type. Cela dit, la valeur D'IsPrimitive renvoie false

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

EDIT: je veux reprendre ma réponse ici. Il n'est pas techniquement un type primitif, mais partage les propriétés que j'ai indiquées ci-dessus.

0
répondu Tim Carter 2010-10-19 06:41:14

dans c# les types sont principalement définis comme deux types: les types de valeur et les types primitifs.

voir D'abord la définition des types primitifs en C#.

d'un autre côté, toutes les données primitives les types en C# sont des objets dans le système espace de noms. Pour chaque type de données, un court nom ou alias, est fourni. Pour exemple, l'int est le nom court pour Système.Int32 et double est le court forme de Système.Double.

maintenant, lisez cet article pour la différence: types primitifs et types de valeur

System.String cartes " string ", qui est un type primitif dans la CLI. mais dans la réalité, les types de valeur sont ceux qui vont dans la pile et pas dans l'espace de tas.

donc, la clé est types de valeurs vs types primitifs . Par Microsoft définition de primitives, c'est un type primitif, mais dans un sens plus général, ses pas.

0
répondu zengr 2013-10-07 19:16:08

ils ne sont pas, parce qu'ils sont séquence de caractères

-1
répondu ballball 2011-11-17 15:02:37