J'ai entendu ces deux mots utilisés dans les tutoriels Microsoft pour VB.NET. Quelle est la différence entre ces deux mots lorsqu'ils sont utilisés en référence à des variables ?
Une explication parfaite !
J'ai entendu ces deux mots utilisés dans les tutoriels Microsoft pour VB.NET. Quelle est la différence entre ces deux mots lorsqu'ils sont utilisés en référence à des variables ?
Variables en C# sont dans 1 des 2 groupes. Valeur types ou Référence types. Des types comme int
y DateTime
sont valeur types. En revanche, toute classe que vous créez est un référence type. Les chaînes de caractères C# sont également un référence type. La plupart des éléments du cadre .NET sont référence types.
Il y a la variable nom et son valeur . Deux parties .
La variable nom est ce que vous déclarer qu'il soit. Le site valeur est ce que vous attribuer à elle.
Toutes les variables reçoivent toujours un initial au moment où la variable est déclaré . Ainsi, toutes les variables sont initialisé .
Pour valeur comme int
le compilateur leur donnera une valeur valide si vous ne le faites pas explicitement. int
's initialiser à zéro par défaut, DateTime
's initialiser a DateTime.MinValue
par défaut.
Référence variables de type initialiser à l'objet que vous lui donnez. Le compilateur ne attribuer un objet (c'est-à-dire une valeur valide) si vous ne le faites pas. Dans ce cas, la valeur est null
- rien. Nous disons donc que la référence est initialisé à zéro.
Les humains sont nés. Les objets sont instanciés. Un bébé est un instance d'un humain, un objet est un instance d'une certaine classe.
L'acte de création d'un instance d'une classe est appelée instanciation (Ta-Da !)
MyClass myClassyReference = new MyClass();
Dans le texte ci-dessus, il est erroné de dire "... créer une instance d'une objeto ..."
edit - 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()
=
.Répéter 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.
Ça : "l'objetA est une instance d'un objet" est profondément faux. Si l'objetA est "une instance de l'objetB", alors il faut que l'objetA commence sa vie avec le type de l'objetB - quel qu'il soit - et son état actuel - quel qu'il soit. Qu'en est-il de la création des objets D, E, et F lorsque l'objetB change ? Non, non ! C'est le cas conceptuel et technique du "objectA is an instance of a Class". "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 assigné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 pointe mon doigt sur votre code et je dis "cette instance a une propriété invalide. C'est peut-être pour cela que la boucle échoue. Vous devez valider les paramètres pendant l'instanciation". (c'est-à-dire les arguments du constructeur).
Je vois ceci dans votre code ,
MyClass myClassyReference;
myClassyReference.DoSomething();
"Vous avez déclaré la variable mais vous ne l'avez jamais assignée. Elle est nulle donc elle ne fait référence à rien. C'est pourquoi l'appel de la méthode lève une exception."
montage final
A type de référence Le nom et la valeur de la variable existent indépendamment. Et je dis bien indépendant.
Un site instancié peut avoir ou non une référence à cet objet.
Un site instancié peut avoir de nombreuses références à cet objet.
A déclaré la référence peut être ou ne pas être pointant vers un objet.
S'il est faux de dire : "... créer une instance d'un objet...", que devriez-vous dire ? "...l'instanciation d'un objet, et l'attribution d'une référence à celui-ci..." ?
Ou encore : "...instancier un objet, et initialiser une variable à une référence de celui-ci" ? Cela inclut les deux mots et semble tout expliquer, même si c'est un peu long. Qu'en pensez-vous ?
A variable est initialisé avec une valeur. Un site objeto 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é . Une fois que j'ai attribué une valeur à l'élément obj
la variable sera initialisée. Voici des exemples d'initialisation :
obj = 1
obj = "foo"
L'instanciation est une chose très différente mais elle 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, l'élément obj
La variable est initialisé avec la référence à la nouvelle Object
qui était instancié . Nous disons que le nouveau Object
a été instancié car nous avons créé une nouvelle instance de celui-ci.
Je pense que VB.NET rend cela beaucoup plus confus 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 y a à la fois une instanciation d'une instance et une initialisation d'une variable :
Object obj = new Object();
@Andrew object obj = 1 ; est une initialisation et object obj = new object()/ est une instanciation et une initialisation c'est ce que vous avez mentionné. Maintenant je veux vous demander deux choses. 1. qu'est-ce que c'est ? objet obj ; ? 2. est-ce que la mémoire a été allouée quand j'utilise l'objet obj; ?? ou bien elle est allouée quand je l'initialise avec ce code objet obj = 1; ?
A initialiser quelque chose est de le mettre à sa valeur initiale. Pour instancier quelque chose est d'en créer une instance.
Souvent, il s'agit plus ou moins de la même chose. Ceci :
SqlConnection conn = new SqlConnection();
instancie a SqlConnection
et initialise le site conn
en lui attribuant la valeur de cette instance.
Puisque le constructeur d'un objet définit également les propriétés de l'objet à 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).
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.