¿Cuál es la diferencia entre "instanciado" e "inicializado"?

105

He estado escuchando estas dos palabras utilizadas en los tutoriales de Microsoft para VB.NET. ¿Cuál es la diferencia entre estas dos palabras cuando se usan en referencia a variables?

l --''''''--------- '' '' '' '' '' '
fuente

Respuestas:

142

Valor frente a tipos de referencia

Las variables en C # están en 1 de 2 grupos. Tipos de valor o tipos de referencia . Los tipos como inty DateTimeson tipos de valor . Por el contrario, cualquier clase que cree es un tipo de referencia . Las cadenas de C # también son un tipo de referencia . La mayoría de las cosas en el marco .NET son tipos de referencia .

Partes de una variable

Está el nombre de la variable y su valor . Dos partes .

El nombre de la variable es lo que declaras que es. El valor es lo que le asignas .

Las variables se inicializan

Todas las variables siempre reciben un valor inicial en el punto en que se declara la variable . Por tanto, se inicializan todas las variables .

Para los tipos de valor , como intel compilador les dará un valor válido si no lo hace explícitamente. int's inicializan a cero por defecto, DateTime' s inicializan a DateTime.MinValuepor defecto.

Las variables de tipo de referencia se inicializan en el objeto que le da. El compilador no asignará un objeto (es decir, un valor válido) si no lo hace. En este caso, el valor es nullnada. Entonces decimos que la referencia se inicializa a nula.

Se crean instancias de objetos

Los humanos nacen. Se crean instancias de los objetos. Un bebé es una instancia de un Humano, un objeto es una instancia de alguna Clase.

El acto de crear una instancia de una clase se llama instanciación (¡Ta-Da!)

Así que declarar , inicializar e instanciar se unen así

MyClass myClassyReference = new MyClass();

En lo anterior, es incorrecto decir "... creando una instancia de un objeto ..."


editar - inspirado en comentarios de discusión

Están sucediendo tres cosas distintas (arriba) utilizando una terminología distinta y esa terminología no es intercambiable:

  1. Se declara una variable de referencia: MyClass myClassyReference
  2. Se crea una instancia de un objeto (... de / de una clase dada , implícito) -new MyClass()
  3. El objeto se asigna a la variable. =.

Reafirmando los hechos:

  1. Una variable de tipo de referencia también se denomina simplemente "una referencia". Una "variable de tipo valor" no es una referencia.

  2. Esto: "objectA es una instancia de un objeto" es profundamente erróneo. Si objectA era "una instancia de objectB", entonces debe ser que objectA comienza su vida con el tipo de objectB, sea lo que sea, y el estado actual, sea lo que sea. ¿Qué hay de la creación de objetos D, E y F a medida que cambia el objeto B? ¡No, no! Es el caso conceptual y técnico el "objetoA es una instancia de una Clase". "Instanciación" e "instancia de" tienen un significado preciso: un objeto obtiene su tipo, definiciones y valores de una Clase.

  3. MyClass myClassyReference = null Generalmente no decimos "la variable está asignada a nulo" y nunca decimos "la variable hace referencia a nulo", no en su lugar decimos "la variable es nula"; o "la variable no hace referencia a nada", o "la referencia es nula"

Aplicación práctica:

  • Apunto con el dedo a tu código y digo "esta instancia tiene una propiedad no válida. Quizás por eso falla el bucle. Tienes que validar los parámetros durante la instanciación". (es decir, argumentos del constructor).

  • Veo esto en tu código

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    "Declaraste la variable pero nunca la asignaste. Es nula, por lo que no hace referencia a nada. Por eso la llamada al método arroja una excepción".

fin editar


La insoportable levedad del ser

Un tipo de referencia nombre y el valor de la variable existe independientemente. Y me refiero a independiente.

Un objeto instanciado puede tener o no una referencia a él.

Un objeto instanciado puede tener muchas referencias a él.

Una referencia declarada puede apuntar o no a un objeto.

radarbob
fuente
¡Explicación perfecta!
M. Fawad Surosh
Si es incorrecto decir: "... creando una instancia de un objeto ...", ¿qué debería decir? "... instanciar un objeto y asignarle una referencia ..."?
Aaron Dake
¿O qué pasa con: "... instanciar un objeto e inicializar una variable a una referencia de él"? Eso incluye ambas palabras y parece deletrearlo todo, aunque de una manera bastante larga. ¿Qué piensas?
Aaron Dake
... que deberías decir? Diga: "creando una instancia de una clase", no '... de un objeto'. Y "instanciar una variable a una referencia de la misma" es hablar doble y es incorrecto en 2 formas: (1) solo se instancian los objetos. (2) Una variable que 'apunta a' un objeto es una variable de referencia, o en resumen, la variable es la referencia. Lo diré de otra manera: una variable de "tipo de referencia" es una referencia. Se refiere o apunta a un objeto.
radarbob
40

Una variable se inicializa con un valor. Se crea una instancia de un objeto cuando se le asigna memoria y se ha ejecutado su constructor.

Por ejemplo, aquí hay una variable:

Dim obj as Object

Esta variable no se ha inicializado . Una vez que asigno un valor a la objvariable, la variable se inicializará. A continuación, se muestran ejemplos de inicialización:

obj = 1
obj = "foo"

La creación de instancias es una cosa muy diferente, pero está relacionada, ya que la creación de instancias suele ir seguida de la inicialización:

Dim obj As New Object()

En la línea anterior de código, la objvariable se inicializa con la referencia a la nueva instanciaObject que se creó . Decimos que Objectse creó una instancia de la nueva porque hemos creado una nueva instancia de la misma.

Ahora creo que VB.NET hace que esto sea mucho más confuso que C # porque no está claro que se esté realizando una asignación en el código anterior. En C # es mucho más claro que hay una instanciación de una instancia y una inicialización de una variable:

Object obj = new Object();
Andrew Hare
fuente
@Andrew objeto obj = 1; es inicialización y objeto obj = nuevo objeto () / es instanciación e inicialización, esto es lo que ha mencionado. Ahora quiero preguntarte dos cosas. 1. ¿Qué es esto? object obj; ? 2. ¿Se ha asignado la memoria cuando uso el objeto obj? o se ubica cuando lo inicializo con este objeto de código obj = 1; ?
kashif
Yo diría que "object obj" es la declaración, y no, aún no se ha asignado memoria. O al menos sólo la memoria suficiente para contener un valor de "nulo". La memoria real para la variable se asignará en función del valor una vez que se inicialice.
Aaron Dake
14

Para inicializar algo es ponerlo a su valor inicial. Crear una instancia de algo es crear una instancia de ello.

A menudo esto es más o menos lo mismo. Esta:

SqlConnection conn = new SqlConnection();

crea una instancia de un SqlConnectionobjeto e inicializa la connvariable configurándola en esa instancia.

Dado que el constructor de un objeto también establece las propiedades del objeto en sus valores predeterminados, a menudo es correcto decir que la instanciación de un objeto lo inicializa. (Engañoso, si el objeto expone un método al que debe llamar explícitamente para inicializarlo después de crear una instancia, como sucede a veces).

Robert Rossney
fuente
4

* Instanciación significa crear una instancia para una clase u objeto. Inicialización significa * iniciar el mismo objeto o clase para cualquier propósito. **

Sona
fuente
3

Instanciado significa que se ha creado una instancia del objeto. Iniciado significa que ese mismo objeto ha realizado alguna inicialización.

Gabriel McAdams
fuente
2

Cuando crea una instancia de una clase u objeto, está creando una nueva instancia de la misma, o asignando memoria para "mantener" una. Inicializar ese objeto serían las instrucciones que se realizan durante la instanciación.

typeoneerror
fuente
2

La instanciación es cuando creas una instancia de una clase. Entonces, esa instancia es un objeto, y puede establecer sus propiedades o llamar a métodos en él (decirle que haga cosas).

La iniciación es cuando estableces un conjunto de condiciones iniciales para algo. Ese algo podría ser un objeto, donde le dices que se inicie, o simplemente una variable a la que le asignas un valor.

Un objeto puede inicializar algunas otras cosas, o incluso instanciar otros objetos como parte de su iniciación.

La diferencia es que la instanciación es la creación de algo que puede hacer cosas; la iniciación es algo que se hace.

ChrisA
fuente
1

Consulte los documentos de Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" Punto originOne = nuevo Punto (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
fuente
1

Podemos verlo de esta manera. Para una línea de código a continuación:

var p = new Person();

La línea anterior se puede leer de dos formas siguientes:

  1. La variable p se ha inicializado como una clase de persona
  2. La clase de persona se ha instanciado en la variable p

El tema de referencia o el contexto importa. Cuando hablamos en términos de variable , usamos la palabra inicializar . Cuando hablamos en términos de clase / tipo , usamos la palabra instanciar .

MrClan
fuente
0

La instanciación se refiere a la asignación de memoria para crear una instancia de una clase, mientras que la inicialización se refiere a nombrar esa instancia asignando el nombre de la variable a esa instancia.

P.ej: SqlConnection conn = new SqlConnection();

Aquí newhay una palabra clave que asigna memoria para una instancia y connes un nombre de variable asignado para esa instancia.

Rizwan
fuente
0

Otros han explicado la diferencia, así que no entraré en detalles. Pero hay casos en los que la creación de instancias no inicializa correctamente un objeto. Cuando crea una instancia de un objeto, también lo inicializa con algunos datos. La clase / tipo tendrá la lógica de inicialización, mientras que la lógica de creación de instancias generalmente se lleva a cabo mediante la newpalabra clave (básicamente asignación de memoria, copia de referencia, etc.). Pero la instanciación no tiene por qué resultar necesariamente en un estado válido para los objetos, que es cuando podemos decir que el objeto no está inicializado . Aquí hay un ejemplo práctico en el que se puede crear una instancia de un objeto pero no inicializar (lo siento, por ejemplo, en C #).

class P { string name = "Ralf"; }

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

GetUninitializedObject no llama al constructor para crear una instancia del objeto allí (pero algo de magia interna).

También se podría argumentar que los tipos de valor no se instancian, sino que solo se inicializan, ya que no necesita una nueva asignación cuando lo hace, new..pero eso depende de la definición de instanciación de uno.

nawfal
fuente