web-dev-qa-db-fra.com

c #: différence entre "System.Object" et "objet"

En C #, existe-t-il une différence entre utiliser System.Object dans le code plutôt que simplement object ou System.String plutôt que string et ainsi de suite? Ou est-ce juste une question de style? 

Y a-t-il une raison pour laquelle un formulaire est préférable à un autre?

67
Paolo Tedesco

string est un alias pour global::System.String. C'est simplement du sucre syntaxique. Les deux sont exactement interchangeables dans presque tous les cas, et il n'y aura aucune différence dans le code compilé.

Personnellement, j'utilise les alias pour les noms de variables, etc., mais j'utilise les noms de type CLR pour les noms dans les API, par exemple:

public int ReadInt32() // Good, language-neutral

public int ReadInt() // Bad, assumes C# meaning of "int"

(Notez que le type de retour n'est pas vraiment un nom - il est codé comme un type dans les métadonnées, il n'y a donc aucune confusion.)

Les seuls endroits que je connaisse où l’un peut être utilisé et l’autre ne peut pas (à ma connaissance) sont:

  • nameof interdit l'utilisation d'alias
  • Lorsque vous spécifiez un type sous-jacent de base enum, vous pouvez utiliser les alias only
65
Jon Skeet

Le objet type est un alias pour System.Object . Le type object est utilisé et affiché en tant que mot clé. Je pense que cela a quelque chose à voir avec l'héritage, mais ce n'est qu'une farce.

Regardez cette page MSDN pour tous les détails.

Je préfère utiliser les versions minuscules, mais sans raison particulière. Tout simplement parce que la coloration syntaxique est différente sur ces types "de base" et que je n'ai pas à utiliser la touche Majuscule pour taper ...

7
Sorskoot

L'un est un alias à l'autre. C'est bas pour le style.

6
Johnno Nolan

string est un alias pour global::System.String et object pour global::System.Object

Si vous avez using System; dans votre classe, String/string et Object/object sont fonctionnellement identiques et leur utilisation dépend du style.

(EDIT: supprimé citation légèrement trompeuse , selon le commentaire de Jon Skeet)

3
Colin Pickard

string (avec le minuscule "s") est le type de chaîne du langage C # et le type System.String est l'implémentation de string dans le framework .NET.

En pratique, il n'y a pas de différence en plus des différences stylistiques.

EDIT: Puisque ce qui précède n'était évidemment pas assez clair, il n'y a pas de différence entre eux, ils sont du même type une fois compilés. J'expliquais la différence sémantique que voit le compilateur (qui n'est qu'un sucre syntaxique, un peu comme la différence entre une boucle while et for).

1
Matthew Scharley

objet , int , long et bool ont été fournis en tant que roues d'entraînement pour les ingénieurs qui avaient du mal à s'adapter à l'idée que les types de données ne faisaient pas partie intégrante de la langue. C #, contrairement aux langues précédentes, ne limite pas le nombre de types de données que vous pouvez ajouter. La bibliothèque 'System' fournit un kit de démarrage contenant des types utiles tels que System.Int32 , System.Boolean , System.Double , System.DateTime et ainsi de suite, mais les ingénieurs sont encouragés à ajouter les leurs. Parce que Microsoft souhaitait adopter rapidement leur nouveau langage, ils ont fourni des alias lui donnant l’apparence d’un langage ressemblant davantage à du "C", mais ces alias sont une fonctionnalité tout à fait jetable (le langage C # serait tout aussi bon si vous supprimé tous les alias intégrés, probablement mieux).

Bien que StyleCop impose l'utilisation des alias de style C hérités, il s'agit d'un défaut pour un ensemble de règles par ailleurs logique. Pour l'instant, je n'ai entendu aucune justification de cette règle (SA1121) qui ne soit pas basée sur un dogme. Si vous pensez que SA1121 est logique, pourquoi n’existe-t-il aucun type de construction pour datetime ?

0
Donald Airey

Il n'y a pas de différence. Il existe un certain nombre de types, appelés Types de données primitives qui sont traités par le compilateur dans le style que vous avez mentionné.

Le style de dénomination en majuscule est la règle de dénomination ISO. C'est plus général, commun; force les mêmes règles de nommage pour tous les objets de la source sans exceptions, comme le compilateur C #.

0
abatishchev

A ma connaissance, je sais que c'est un raccourci, il est plus facile d'utiliser string, plutôt que System.string.

Mais attention, il y a une différence entre String et string (c # est sensible à la casse)

0
Omar Abid