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?
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?
Réponses:
Les variables en C # sont dans 1 des 2 groupes. Types de valeur ou types de référence . Les types comme int
et DateTime
sont 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 .
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 .
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 int
le compilateur leur donnera une valeur valide si vous ne le faites pas explicitement. int
s initialise à zéro par défaut, DateTime
s initialise à DateTime.MinValue
par 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 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!)
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:
MyClass myClassyReference
new MyClass()
=
.Reprenant les faits:
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.
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.
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
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.
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 obj
variable, 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 obj
variable est initialisée avec la référence au nouveau Object
qui 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();
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 SqlConnection
objet et initialise la conn
variable 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.)
Instancié signifie qu'une instance de l'objet a été créée. Initié signifie que ce même objet a effectué une initialisation.
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.
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.
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."
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:
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 .
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 new
un mot-clé qui alloue de la mémoire pour une instance et conn
est un nom de variable attribué à cette instance.
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 new
mot - 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.