Quelle est la différence entre «instancié» et «initialisé»?

105

J'ai entendu ces deux mots utilisés dans les didacticiels Microsoft pour VB.NET. Quelle est la différence entre ces deux mots lorsqu'ils sont utilisés en référence à des variables?

l --''''''--------- '' '' '' '' '' '
la source

Réponses:

142

Valeur vis-à-vis des types de référence

Les variables en C # sont dans 1 des 2 groupes. Types de valeur ou types de référence . Les types comme intet DateTimesont des types de valeur . En revanche, toute classe que vous créez est un type de référence . Les chaînes C # sont également un type de référence . La plupart des éléments du framework .NET sont des types de référence .

Parties d'une variable

Il y a le nom de la variable et sa valeur . Deux parties .

Le nom de la variable est ce que vous déclarez . La valeur est ce que vous lui attribuez .

Les variables sont initialisées

Toutes les variables reçoivent toujours une valeur initiale au moment où la variable est déclarée . Ainsi, toutes les variables sont initialisées .

Pour les types valeur , comme intle compilateur leur donnera une valeur valide si vous ne le faites pas explicitement. ints initialise à zéro par défaut, DateTimes initialise à DateTime.MinValuepar défaut.

Les variables de type référence s'initialisent à l'objet que vous lui donnez. Le compilateur n'attribuera pas d'objet (c'est-à-dire une valeur valide) si vous ne le faites pas. Dans ce cas, la valeur est null- rien. On dit donc que la référence est initialisée à null.

Les objets sont instanciés

Les humains sont nés. Les objets sont instanciés. Un bébé est une instance d'un humain, un objet est une instance d'une classe.

L'acte de créer une instance d'une classe est appelé instanciation (Ta-Da!)

Alors déclarez , initialisez et instanciez comme ceci

MyClass myClassyReference = new MyClass();

Dans ce qui précède, il est faux de dire "... création d'une instance d'un objet ..."


modifier - inspiré par la discussion des commentaires

Trois choses distinctes se passent (ci-dessus) en utilisant une terminologie distincte et cette terminologie n'est pas interchangeable:

  1. Une variable de référence est déclarée - MyClass myClassyReference
  2. Un objet est instancié (... à partir de / d'une classe donnée , implicite) -new MyClass()
  3. L'objet est affecté à la variable. =.

Reprenant les faits:

  1. Une variable de type référence est également appelée simplement "une référence". Une "variable de type valeur" n'est pas une référence.

  2. Ceci: "objectA est une instance d'un objet" est profondément faux. Si objectA était "une instance d'objetB" alors ce doit être que objectA commence sa vie avec le type d'objetB - quel qu'il soit - et son état actuel - quel qu'il soit. Qu'en est-il de la création d'objets D, E et F lorsque l'objetB change? Non, non! C'est le cas conceptuel et technique que «l'objetA est une instance d'une classe». «Instanciation» et «instance de» ont une signification précise - un objet obtient son type, ses définitions et ses valeurs d'une classe.

  3. MyClass myClassyReference = null En général, nous ne disons pas «la variable est affectée à null» et nous ne disons jamais «la variable fait référence à null», non, nous disons plutôt «la variable est nulle»; ou "la variable ne fait référence à rien", ou "la référence est nulle"

Application pratique:

  • Je tape du doigt votre code et dis "cette instance a une propriété non valide. C'est peut-être pourquoi la boucle échoue. Vous devez valider les paramètres lors de l'instanciation." (c'est-à-dire les arguments du constructeur).

  • Je vois ça dans ton code,

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    "Vous avez déclaré la variable mais ne l'avez jamais affectée. Elle est nulle donc elle ne fait référence à rien. C'est pourquoi l'appel de méthode lève une exception."

terminer la modification


l'insoutenable légèreté de l'être

Un Type référence de nom et la valeur de la variable existe indépendamment. Et je veux dire indépendant.

Un objet instancié peut ou non y faire référence.

Un objet instancié peut avoir de nombreuses références.

Une référence déclarée peut ou non pointer vers un objet.

radarbob
la source
Explication parfaite!
M. Fawad Surosh
S'il est faux de dire: "... création d'une instance d'un objet ...", que devez-vous dire? "... instancier un objet et lui attribuer une référence ..."?
Aaron Dake
Ou qu'en est-il: "... instancier un objet, et initialiser une variable à une référence de celui-ci"? Cela comprend les deux mots et semble tout expliquer - bien que de manière assez longue. Qu'est-ce que tu penses?
Aaron Dake
... que devriez-vous dire? Dites: "créer une instance d'une classe", et non "... d'un objet". Et "instancier une variable à une référence de celle-ci" est un double discours et est faux de deux manières: (1) seuls les objets sont instanciés. (2) Une variable «pointant vers» un objet est une variable de référence, ou en bref, la variable est la référence. Je vais le dire différemment: une variable "type référence" est une référence. Il fait référence à - ou pointe vers - un objet.
radarbob
40

Une variable est initialisée avec une valeur. Un objet est instancié lorsque de la mémoire lui est allouée et que son constructeur a été exécuté.

Par exemple, voici une variable:

Dim obj as Object

Cette variable n'a pas été initialisée . Une fois que j'attribue une valeur à la objvariable, la variable sera initialisée. Voici des exemples d'initialisation:

obj = 1
obj = "foo"

L'instanciation est une chose très différente mais est liée puisque l'instanciation est généralement suivie d'une initialisation:

Dim obj As New Object()

Dans la ligne de code précédente, la objvariable est initialisée avec la référence au nouveau Objectqui a été instancié . Nous disons que le nouveau a Objectété instancié parce que nous en avons créé une nouvelle instance.

Maintenant, je crois que VB.NET rend cela beaucoup plus déroutant que C # car il n'est pas clair qu'une affectation a lieu dans le code ci-dessus. En C #, il est beaucoup plus clair qu'il existe à la fois une instanciation d'une instance et une initialisation d'une variable:

Object obj = new Object();
Andrew Hare
la source
@Andrew object obj = 1; est l'initialisation et l'objet obj = nouvel objet () / est l'instanciation et l'initialisation c'est ce que vous avez mentionné. Maintenant, je veux vous demander deux choses. 1. qu'est-ce que c'est? object obj; ? 2. la mémoire a-t-elle été allouée lorsque j'utilise l'objet obj; ?? ou il est localisé lorsque je l'initialise par cet objet de code obj = 1; ?
kashif
Je dirais que "object obj" est la déclaration, et non, la mémoire n'a pas encore été allouée. Ou au moins juste assez de mémoire pour contenir une valeur de "null". La mémoire réelle de la variable sera allouée en fonction de la valeur une fois qu'elle est initialisée.
Aaron Dake
14

Pour initialiser quelque chose à elle à sa valeur initiale. Pour instancier quelque chose est de créer une instance de celui - ci.

C'est souvent plus ou moins la même chose. Ce:

SqlConnection conn = new SqlConnection();

instancie un SqlConnectionobjet et initialise la connvariable en la définissant sur cette instance.

Étant donné que le constructeur d'un objet définit également les propriétés de l'objet sur leurs valeurs par défaut, il est souvent correct de dire que l'instanciation d'un objet l'initialise. (Trompeur, si l'objet expose une méthode que vous devez appeler explicitement pour l'initialiser après son instanciation, comme c'est parfois le cas.)

Robert Rossney
la source
4

* Instanciation signifie créer une instance pour une classe ou un objet. L'initialisation signifie * initier le même objet ou la même classe dans n'importe quel but. **

Sona
la source
3

Instancié signifie qu'une instance de l'objet a été créée. Initié signifie que ce même objet a effectué une initialisation.

Gabriel McAdams
la source
2

Lorsque vous instanciez une classe ou un objet, vous créez une nouvelle instance de celui-ci ou allouez de la mémoire à une classe "en attente". L'initialisation de cet objet correspond aux instructions exécutées lors de l'instanciation.

typeoneerror
la source
2

L'instanciation se produit lorsque vous créez une instance d'une classe. Cette instance est alors un objet et vous pouvez définir ses propriétés ou appeler des méthodes dessus (lui dire de faire les choses).

L'initiation est lorsque vous définissez un ensemble de conditions initiales pour quelque chose. Ce quelque chose peut être un objet, où vous lui dites de se lancer, ou simplement une variable à laquelle vous attribuez une valeur.

Un objet peut initialiser d'autres choses, ou même instancier d'autres objets dans le cadre de son lancement.

La différence est que l'instanciation est la création d'une chose qui peut faire des choses; l'initiation est une chose qui se fait.

ChrisA
la source
1

Consultez la documentation Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" Point originOne = nouveau point (23, 94);

Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object."
Jaros
la source
1

Nous pouvons le voir de cette façon. Pour une ligne de code ci-dessous:

var p = new Person();

La ligne ci-dessus peut être lue comme suit:

  1. La variable p a été initialisée en tant que classe de personne
  2. La classe Person a été instanciée dans la variable p

Le sujet de référence ou le contexte est important. Quand on parle en termes de variable , on utilise le mot initialize . Quand on parle en termes de classe / type , on utilise le mot instancier .

MrClan
la source
0

L'instanciation fait référence à l'allocation de mémoire pour créer une instance d'une classe, tandis que l'initialisation fait référence à l'attribution d'un nom à cette instance en attribuant le nom de variable à cette instance.

Par exemple: SqlConnection conn = new SqlConnection();

Voici newun mot-clé qui alloue de la mémoire pour une instance et connest un nom de variable attribué à cette instance.

Rizwan
la source
0

D'autres ont expliqué la différence, je n'entrerai donc pas dans les détails. Mais il existe des cas où l'instanciation n'initialise pas correctement un objet. Lorsque vous instanciez un objet, vous l'initialisez également avec des données. La classe / type aura la logique d'initialisation, tandis que la logique d'instanciation est généralement effectuée par le newmot - clé (essentiellement allocation de mémoire, copie de référence, etc.). Mais l'instanciation ne doit pas nécessairement aboutir à un état valide pour les objets, c'est-à-dire lorsque nous pouvons dire que l'objet n'est pas initialisé . Voici un exemple pratique où un objet peut être instancié mais pas initialisé (désolé par exemple en C #).

class P { string name = "Ralf"; }

WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

GetUninitializedObject n'appelle pas le constructeur pour y instancier un objet (mais un peu de magie interne).

On pourrait également affirmer que les types de valeur ne sont pas instanciés mais uniquement initialisés car ils n'ont pas besoin de nouvelle allocation lorsque vous le faites, new..mais cela dépend de la définition de l'instanciation.

nawfal
la source