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?
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?
Respuestas:
Las variables en C # están en 1 de 2 grupos. Tipos de valor o tipos de referencia . Los tipos como int
y DateTime
son 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 .
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 .
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 int
el 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.MinValue
por 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 null
nada. Entonces decimos que la referencia se inicializa a nula.
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!)
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:
MyClass myClassyReference
new MyClass()
=
.Reafirmando los hechos:
Una variable de tipo de referencia también se denomina simplemente "una referencia". Una "variable de tipo valor" no es una referencia.
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.
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
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.
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 obj
variable, 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 obj
variable se inicializa con la referencia a la nueva instanciaObject
que se creó . Decimos que Object
se 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();
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 SqlConnection
objeto e inicializa la conn
variable 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).
Instanciado significa que se ha creado una instancia del objeto. Iniciado significa que ese mismo objeto ha realizado alguna inicialización.
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.
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.
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."
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:
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 .
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í new
hay una palabra clave que asigna memoria para una instancia y conn
es un nombre de variable asignado para esa instancia.
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 new
palabra 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.