Intentaré explicártelo de forma distinta a los tecnicismos que hayas leido por Internet, para intentar que te sea más fácil su comprensión...:
Se le suele llamar
object (u objeto) a una representación de una estructura de datos encapsulada o una abstracción de algoritmos, que expone su funcionalidad mediante los miembros del lenguaje,
éstos miembros en la plataforma .Net pueden ser: variables (a esto se le suele llamar
campos o
fields), constantes (o
constants), propiedades (o
properties), métodos (o
methods), funciones (o
functions), enumeraciones (o
enums), estructuras (o
structs), eventos (o
events), y un largo etcétera.
Pues bien, habiendo comprendido lo anterior, podemos decir que una instancia es una copia única del objeto, es un punto de referencia que habilita el acceso a los miembros que contenga definidos ese objeto.
Cuando creas una instancia, lo que estás haciendo es crear/asignar un espacio de memoria para consumir ese objeto por un tiempo de vida limitado, hasta que sea destruido/liberado.
También cabe mencionar que...:
- Tal vez el fallo más común entre los programadores iniciados (por ese motivo te advierto) pueda ser el hecho de intentar utilizar los miembros de un objeto que no ha sido instanciado,
y al no existir una referencia en memoria de ese objeto, esto causará un error de referencia nula en tiempo de ejecución.
Para ser más exactos, se trata de una excepción del tipo System.NullReferenceException.
El término estandarizado a veces simplemente depende de los factores que hacen que se popularice un término para un lenguaje en específico, puedes referirte a un método por otros términos cómo procedimiento (o
procedure), subrutina (o
sub-routine), rutina (o
routine), y unidad (o
unit), y toda esta terminología podría llevarte a la confusión, sobre todo el último término mencionado, ya que en realidad sirve para referirse a cualquier unidad de código (es decir, a cualquier linea/instrucción del código fuente por individual), pero... vaya, si, se llaman métodos.
En la plataforma .Net (y por lo general en el resto de lenguajes también), se le denomina 'método' a un bloque de código que ejecuta una serie de instrucciones y finaliza su ejecución sin devolver un tipo de valor.
Ejemplo:
public void MyMethod() {
int value = 1;
value += 3;
Console.WriteLine(value);
}
Si un método devuelve un tipo de valor, entonces se le denomina 'función'.
Ejemplo:
public int MyFunction() {
int value = 1;
value += 3;
return value;
}
En una "estancia" no, pero en una
instancia si
.
Para instanciar una class, debes invocar al constructor (o
ctor) de esa class, y para ello se utiliza el operador
new (como en el ejemplo que has mostrado con
new Perro()):
También cabe mencionar que...:
- Un constructor es un método, solo que tiene un nombre estándar distinto que describe un propósito en particular.
- Hay classes/types que son instanciables, y otros que no lo son (ej.: una class que en su firma tenga declarado el modificador abstract).
- Una class instanciable puede tener más de un constructor definido. A cada constructor adicional se le denomina sobrecarga (u overload), y esto se aplica a cualquier tipo de miembro sobrecargable (ej.: métodos, funciones, y propiedades).
- Puedes instanciar classes/types utilizando la función System.Activator.CreateInstance(), pero esta metodología se utiliza en circunstancias muy específicas, y generalmente por necesidad, por ejemplo en la ingeniería inversa de ensamblados .Net para instanciar types mediante técnicas por Reflection.
El type es Perro, solo que es una nueva instancia de ese type, por lo que la respuesta a esa pregunta es: Sí.(entendí mal la pregunta)
No se me ocurre muy bien como explicárte que es un
Type sin profundizar en más cosas que necesitarían una explicación (cómo interfaces, estructuras, herencia, classes base e implementaciones), así que lo intentaré resumir de forma poco precisa...:
- Un tipo (o type) es lo que asegura que las funcionalidades de un objeto existan en tiempo de ejecución.
Cualquier class que sea instanciable enfocada a representar cierta funcionalidad se considera un type (entre otro tipo de miembros que se consideran un type),
la class
System.Object es un type que representa un objeto, y absolutamente todas las classes de .Net Framework heredan ese base-type (heredar, de forma muy resumida significa aplicarle a una class la funcionalidad definida en otra class, sin tener que volver a redeclarar esa funcionalidad),
otro ejemplo de un type sería la class
System.Windows.Forms.Form que representa la funcionalidad y el comportamiento de una ventana de la interfáz gráfica de tu aplicación,
y otro ejemplo sería esta class instanciable de aquí abajo que representa los atributos de un perro:
public class Dog {
public string Name { get; set; }
public string Race { get; set; }
public int Age { get; set; }
private Dog() {
}
public Dog(string name, string race, int age) {
this.Name = name;
this.Race = race;
this.Age = age;
this.MyMethod();
}
private void MyMethod() {
// Do something...
}
}
Eso sería considerado el type
Dog. No lo veas como el nombre de la class, intenta visualizarlo más bien como la funcionalidad de una class instanciable, es decir, referirnos al type
Dog es referirnos a una estructura de datos que implica 3 propiedades y un constructor definido para representar algo en particular.
Quizás te resulte más facil con un ejemplo para evaluar el type:
Dog dogInstance
= new Dog
(name
: "Rompe-huesos", race
: "Bulldog", age
: 3);Type t = dogInstance.GetType();
Console.WriteLine(string.Format("Dog type name : {0}", t.Name));
Console.WriteLine(string.Format("Dog type full name: {0}", t.FullName));
...O este otro ejemplo:
Dog dogInstance
= new Dog
(name
: "Rompe-huesos", race
: "Bulldog", age
: 3);bool isDogType
= (dogInstance
is Dog
); Console.WriteLine(string.Format("'dogInstance' object is type of 'Dog'?: {0}", Convert.ToString(isDogType)))
Una class que no se consideraría un type, sería cualquier class no-instanciable de propósito general, como por ejemplo la class
System.IO.Path, que se considera un type, sin embargo, una class no-instanciable siempre será considerado del type
System.Object, ya que es el base-type principal de la jerarquía de herencias de types de .Net.
Espero haber podido aclararte algunos conceptos. Si te fijas me he puesto algo pesado explicando las terminologías en Inglés entre paréntesis, pero es esencial conocerlas ...antes que sus nombres en Español.
Saludos