¿Por qué arrojar una excepción en el constructor da como resultado una referencia nula? Por ejemplo, si ejecutamos los códigos a continuación, el valor de teacher es nulo, mientras que st.teacher no (se crea un objeto de Teacher). ¿Por qué?¿Por qué arrojar una excepción en los resultados del constructor en una referencia nula?
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Test();
}
private static void Test()
{
Teacher teacher = null;
Student st = new Student();
try
{
teacher = new Teacher("", st);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.WriteLine((teacher == null)); // output True
Console.WriteLine((st.teacher == null)); // output False
}
}
class Teacher
{
public string name;
public Teacher(string name, Student student)
{
student.teacher = this;
if (name.Length < 5)
throw new ArgumentException("Name must be at least 5 characters long.");
}
}
class Student
{
public Teacher teacher;
}
}
gracias por la gran explicación, edité "objeto nulo" en la pregunta a "referencia nula". –
Gran explicación, también acaba de demostrar que el objeto no inicializado en C# siempre contiene «nulo». Comencé a dudar de eso porque cuando traté de usar en Visual Studio un objeto que podría no ser inicializado en ciertas condiciones, pero de todos modos se verificó como "nulo", y luego se usó, el compilador mostró un error sobre la variable no inicializada. Después de inicializar explícitamente el objeto con «null», el error desapareció. Gracias a ti, ahora sé que es solo un error de Visual Studio. –
@ Hi-Angel: No, no es un error. Es la diferencia entre un * campo * y una variable local. Un campo tiene un valor predeterminado y se puede usar sin haber sido configurado; una variable local * no puede leerse hasta que esté definitivamente asignada. –