una que programacion objetos metodos metodo mandar llamar instancia funciones ejemplos como clases clase c# .net clr

programacion - que es una instancia en c#



Inicialización de campos de instancia vs. variables locales. (7)

Cuando se asigna una porción de memoria para una nueva instancia de objeto, el tiempo de ejecución escribe ceros en todo el bloque, asegurándose de que el nuevo objeto comience en un estado conocido. Es por eso que los enteros predeterminados son 0, los dobles predeterminados son 0.0, punteros y referencias a objetos a nulo, y así sucesivamente.

En teoría, sería posible hacer lo mismo para apilar los marcos asignados como parte de las llamadas a métodos. Aunque la sobrecarga sería alta, ralentizaría drásticamente las llamadas a otros métodos y, por lo tanto, no se intentará.

Siempre me he preguntado por qué en el siguiente ejemplo está bien no inicializar el campo de instancia (confiando en que tendrá su valor predeterminado) y acceder a él, mientras que las variables locales aparentemente deben inicializarse, incluso si lo inicializo a un valor predeterminado se obtendría de todos modos ...

public class TestClass { private bool a; public void Do() { bool b; // That would solve the problem: = false; Console.WriteLine(a); Console.WriteLine(b); //Use of unassigned local variable ''b'' } }


El constructor implícito inicializa la variable de instancia por ti. Incluso cuando especifica un c''tor pero no inicializa un campo, se hace por usted como parte de la creación del objeto en el montón. Eso no es cierto para las variables locales de la pila.


Es una limitación del compilador. El compilador intenta evitar que uses una variable no asignada donde sea posible, lo cual es bueno, ya que usar variables sin inicializar solía ser una fuente común de errores en el código C antiguo.

Sin embargo, el compilador no puede saber si la variable de instancia se inicializa antes de que llegue a esa llamada de método, ya que podría establecerse mediante cualquier otro método, que se puede llamar en cualquier orden mediante un código externo.


Las variables de instancia tienen un valor por defecto. De la especificación C # 3.0:

5.1.2.1 Variables de instancia en clases

Una variable de instancia de una clase comienza a existir cuando se crea una nueva instancia de esa clase, y deja de existir cuando no hay referencias a esa instancia y el finalizador de la instancia (si existe) se ha ejecutado.

El valor inicial de una variable de instancia de una clase es el valor predeterminado (§5.2) del tipo de la variable.

A los fines de la verificación de asignación definida, una variable de instancia se considera inicialmente asignada.


Para las variables locales, el compilador tiene una buena idea del flujo: puede ver una "lectura" de la variable y una "escritura" de la variable, y probar (en la mayoría de los casos) que la primera escritura se realizará antes de la primera lectura. .

Este no es el caso de las variables de instancia. Considere una propiedad simple: ¿cómo sabe si alguien la configurará antes de obtenerla? Eso hace que sea prácticamente imposible aplicar reglas razonables, por lo que debe asegurarse de que todos los campos se configuraron en el constructor o permitirles que tengan valores predeterminados. El equipo de C # eligió la última estrategia.


Realmente es solo una cuestión de lo que la advertencia puede decirte. Realmente no hay forma de que la advertencia se asegure de que algún otro método no haya inicializado la variable de clase, por lo que solo advierte sobre el método en el que se puede estar seguro de que no está inicializado.

Además, es una advertencia y no un error porque no hay nada técnicamente incorrecto en el uso de la variable no asignada (se garantiza que es "falso"), pero es probable que sea un error lógico tenerla sin asignar.


Se rige por las reglas de asignación definitiva en C #. La variable debe ser asignada definitivamente antes de acceder.

5.3 Asignación definitiva

En una ubicación dada en el código ejecutable de un miembro de una función, se dice que una variable se asigna definitivamente si el compilador puede probar, mediante un análisis de flujo estático en particular (§5.3.3), que la variable se ha inicializado automáticamente o se ha ejecutado. El objetivo de al menos una asignación.

5.3.1 Variables asignadas inicialmente

Las siguientes categorías de variables se clasifican como inicialmente asignadas:

  • Variables estáticas.

  • Variables de instancia de instancias de clase.

  • Variables de instancia de las variables de estructura inicialmente asignadas.

  • Elementos de matriz.

  • Parámetros de valor.

  • Parámetros de referencia.

  • Variables declaradas en una cláusula catch o una instrucción foreach.

5.3.2 Variables inicialmente no asignadas

Las siguientes categorías de variables se clasifican como inicialmente no asignadas:

  • Variables de instancia de variables struct inicialmente sin asignar.

  • Parámetros de salida, incluida esta variable de los constructores de instancia de estructura.

  • Variables locales, excepto las declaradas en una cláusula catch o en una instrucción foreach.