tipo - ¿Por qué tengo que asignar un valor a un int en C#cuando el valor predeterminado es 0?
no se puede convertir implícitamente el tipo bool en bool (5)
No los enteros por defecto a 0?
Lo hacen cuando son miembros de datos de una clase, pero no cuando son una variable local: las variables locales deben inicializarse explícitamente antes de ser utilizadas, de ahí el error del compilador.
Esto funciona:
class MyClass
{
int a;
public MyClass()
{
int b = a;
}
}
Pero esto da un error de compilación ("Uso de la variable local no asignada ''a''"):
class MyClass
{
public MyClass()
{
int a;
int b = a;
}
}
Por lo que puedo decir, esto sucede porque en el primer ejemplo, técnicamente, el compilador no sabe que ''a'' no está asignado. En el último ejemplo, ''a'' se define localmente y, por lo tanto, es fácil de rastrear.
Pero, ¿por qué el último ejemplo no funciona?
No los enteros por defecto a 0? ¿Es esto algo que el compilador aplica para las "mejores prácticas"? ¿O hay otra razón?
Cuando instancia una nueva instancia de una clase, toda la memoria que necesita el objeto se "pone a cero", las entradas se establecen en 0, las cadenas se establecen en nulo, etc. Esto es para evitar muchos de los bugs y errores de memoria raros que fueron posibles en C (++). Desafortunadamente, esto también tiene un pequeño costo de procesamiento, por lo que cuando se crea una variable local, el lenguaje asume que usted mismo establecerá el valor muy pronto y no se molesta en ponerlo a cero para disminuir el número total de instrucciones requeridas. Para compensar el riesgo de usar memoria no configurada, esto introduce las comprobaciones del compilador para garantizar que se haya establecido un valor antes de que le permita usar la variable.
En el primer ejemplo, es un campo . Los campos se predeterminan automáticamente a 0 / falso / nulo. En el segundo ejemplo, es una variable . Las variables no están predeterminadas y deben tener una "asignación definida" antes de ser utilizadas.
Básicamente, al crear un objeto (o al inicializar una estructura), este pone a cero la memoria (o en el caso de una estructura no predeterminada, te obliga a inicializar todo manualmente). Sin embargo, las variables son tan comunes (en todos los métodos) que no quiere la sobrecarga de tener que poner a cero la pila todo el tiempo. En cambio, te obliga a indicar el valor inicial.
Eso podría deberse a que a la variable declarada en el nivel de clase no se le puede asignar valor en el mismo ámbito (excepto cuando se declara)
p.ej
class Test
{
int a;
a = 0; // this is not allowed at class level & hence a initialized to default
}
mientras
class Test
{
void test()
{
int a;
int b = a;
a = 20; // this is allowed
}
}
Según mi conocimiento, cuando declaramos una variable en clase y creamos un objeto, el constructor predeterminado inicializa la variable y, por lo tanto, no es necesario inicializar las variables de clase. Pero al llegar a los métodos en clase, no hay ningún constructor ni nada para inicializar esas variables, por lo que no podemos asignar variables no inicializadas en los métodos.