56 votes

Est-ce que tout dans .NET est un objet?

Merci de nous aider à résoudre la controverse de "Presque" tout est un objet (une réponse à Débordement de Pile question en tant Que novice, est-ce que je doit fuir avant d'apprendre le C#?). Je pensais que c'était le cas, comme tout dans Visual Studio, au moins apparaît comme une structure. S'il vous plaît poster une référence, de sorte qu'il ne devienne pas "moderne jackass" (this American Life).

Notez que cette question se réfère à C#, pas nécessairement .NET, et la façon dont il traite les données sous le capot (évidemment, c'est tous les 1 et 0).

Voici les commentaires de "tout est objet":

  • Eh, non, il n'est pas. – Binaire Guerrier
  • Je voudrais un exemple... – scotty2012
  • ce n'est pas tout dérivée de la type de base de l'Objet? – rizzle
  • La plupart des choses sont des objets... – Omar Kooheji
  • Types de valeur, ints, des chambres doubles, objet références (et non pas les objets eux moi), etc ne sont pas des objets. Ils peuvent être "encadré" pour ressembler à des objets (par ex. j'.ToString()) mais ils sont en les types primitifs. Modifier l'entrée de "PRESQUE tout est un objet" et Je vais supprimer le downvote – Binaire Anxieuse
  • J'apprécie la clarification. J' pense que le niveau le plus bas que vous pouvez interagir avec, disons qu'un int en C# est en tant que structure, ce qui n'est pas un objet? - http://msdn.microsoft.com/en-us/library/ms173109.aspx – rizzle
  • Ne pas Int32 hériter de ValueType qui hérite de l'Objet? Si oui, malgré le comportement, un int est un objet. – Chris Farmer
  • Non, la boîte de type int hérite de ValueType, qui hérite de l' Objet. Ils ne sont pas des objets dans l' sens traditionnel du terme, car, d'une int n'est pas une référence à un int, IL EST l'int. b) ints ne sont pas des ordures recueillies. Si vous déclarez un Int32, alors que l'int est de 4 octets sur le pile à la fin de l'histoire – Binaire Guerrier

Définition de l'objet: "Objet" comme un héritier de Système de classe.Objet par rapport à "l'objet" comme une instance d'un type par rapport à "l'objet" comme un type de référence."

80voto

Daniel Schaffer Points 14707

Le problème ici est que c'est vraiment deux questions, une question est à propos de l'héritage, auquel cas la réponse est: "presque tout", et l'autre est sur le type de référence vs type de valeur/mémoire/de boxe, auquel cas la réponse est "non".

L'héritage:

En C#, la suivante est vraie:

  • Tous les types de valeur, y compris les énumérations et les types nullables, sont des dérivés d' System.Object.
  • Toute la classe, tableau, et de déléguer les types sont dérivées à partir d' System.Object.
  • Types d'Interface ne sont pas dérivées d' System.Object. Ils sont tous convertible System.Object, mais les interfaces seulement proviennent d'autres types d'interface, et System.Object n'est pas un type d'interface.
  • Pas de pointeur types de dériver à partir de System.Object, ni aucun d'entre eux directement convertibles System.Object.
  • De type "ouvert" types de paramètres sont également ne proviennent pas de l' System.Object. Type de types de paramètres ne sont pas dérivées à partir de rien; type d'arguments sont contraints d'être dérivée à partir de l'effectif de la classe de base, mais ils ne sont pas "dérivé" de quoi que ce soit.

À partir de MSDN entrée pour le Système.Objet:

Prend en charge toutes les classes de la .NET Cadre hiérarchie de classe et fournit des services de bas niveau pour les classes dérivées. C'est le summum de la classe de base de tous les les classes dans le .NET Framework; il est la racine de la hiérarchie des types.

Les langues ne nécessitent généralement pas une classe de déclarer à l'héritage de Objet parce que l'héritage est implicite.

Parce que toutes les classes de la .NET Cadre sont dérivées de l'Objet, toutes les méthodes définies dans l'Objet la classe est disponible dans tous les objets dans le système. Les classes dérivées peuvent et ne remplacer certaines de ces méthodes.

Donc pas chaque type en C# est dérivé de l' System.Object. Et même pour ces types de, vous avez encore besoin de noter la différence entre les types de référence et des types de valeur, comme ils sont traités de manière très différente.

Boxe:

Alors que la valeur des types héritent d' System.Object, ils sont traités différemment dans la mémoire à partir des types de référence, et de la sémantique de la façon dont ils sont transmis par le biais de méthodes dans votre code sont également différentes. En effet, un type de valeur n'est pas traité comme un Objet (un type de référence), jusqu'à ce que vous enseigner votre application pour faire de la boxe comme un type de référence. Voir plus d'informations sur la boxe en C# ici.

31voto

Matt Enright Points 2949

Un peu en retard à la fête, mais je suis tombé sur ceci dans un résultat de recherche sur DONC et compris le lien ci-dessous peuvent aider les générations futures:

Eric Lippert explique cela très bien, avec une bien meilleure (qualifié) de déclaration:

Le moyen de remédier à ce mythe est tout simplement de remplacer "dérive de" avec "convertible", et à ignorer les types pointeur: non-type de pointeur en C# est convertible à l'objet.

L'essentiel, c', si vous détestez la lecture de bien-explications illustrées de gens qui écrivent des langages de programmation, c'est que (les pointeurs de côté), des choses comme de l'Interface ou de paramètre générique déclarations de type ("T") ne sont pas des objets, mais sont garantis pour être traités comme des objets lors de l'exécution, parce qu'ils ont une certaine instance, qui sera un Objet. D'autres types (Type Enum, de Déléguer, de classes, etc.) sont tous les Objets. Y compris les types de valeur, qui peut être mis en boîte à l'objet, comme d'autres réponses ont discuté.

15voto

Konrad Rudolph Points 231505

Certaines personnes ici ont une notion étrange de ce qu'est un "objet" dans la programmation orientée objet est. Pour que quelque chose pour être un objet, qu'il n'a pas à être un type de référence ou, plus généralement, de suivre toute mise en œuvre officielle.

Tout cela signifie, c'est que l'on peut opérer sur elle comme un citoyen de première classe dans un monde orienté objet. Puisque vous pouvez le faire sur les valeurs en C# (grâce à l'autoboxing), tout est en effet un objet. Dans une certaine mesure, cela est vrai même pour les fonctions (mais sans doute pas pour les classes).

Si cela est pertinent dans la pratique est une autre question, mais c'est un problème général avec la programmation orientée objet que je remarque une fois de plus. Personne n'est clair sur la définition de la programmation orientée objet (oui, la plupart des gens conviennent qu'il a quelque chose à voir avec le polymorphisme, héritage et de l'encapsulation, certains jettent dans "l'abstraction" pour faire bonne mesure).

À partir d'un point de vue usage, chaque valeur dans C# manipule comme un objet. Cela dit, j'aime le actuellement accepté de répondre. Il offre à la fois techniquement aspects importants.

Notez que dans d'autres contextes, par exemple, C++, d'autres aspects sont stressés depuis le C++ n'est pas nécessairement orientée objet et en outre est beaucoup plus porté sur bas niveau des aspects. Par conséquent, la distinction entre les objets, la GOUSSE et de la builtin primitives rend parfois le sens (puis de nouveau, parfois pas).

6voto

GEOCHET Points 13787

Ils sont tous traités comme des objets, mais ce ne sont pas tous des objets. La confusion entre avec Autoboxing.

Voir ceci pour plus d'informations: http://en.wikipedia.org/wiki/Object_type

L'abstraction déroute apparemment les gens.

4voto

Rich Points 16818

Je pensais que les types de valeur ne sont PAS des objets. Ils sont stockés différemment en mémoire par le CLR - les types de valeur sont stockés dans la pile et les objets sont stockés dans le segment de mémoire. Vous pouvez transtyper les types de valeur en types de référence pour qu'ils agissent comme un objet, mais le CLR extrait la valeur de la pile, l'encapsule dans un objet et la stocke dans le segment de mémoire. C'est ce qui arrive quand vous "boxez" une variable.

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