Perché l'eccezione di lancio nel costruttore restituisce un riferimento null? Ad esempio, se eseguiamo i codici sotto il valore di teacher è null, mentre st.teacher non lo è (viene creato un oggetto Teacher). Perché?Perché l'eccezione di lancio nel costruttore restituisce un riferimento null?
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;
}
}
grazie per la grande spiegazione, ho modificato "oggetto nullo" nella domanda in "riferimento null". –
Ottima spiegazione, anche tu hai appena dimostrato che l'oggetto non inizializzato in C# mantiene sempre «null». Ho iniziato a dubitarne, perché quando ho provato a utilizzare in Visual Studio un oggetto che non poteva essere inizializzato in determinate condizioni, ma in ogni caso è stato controllato il controllo di "null", e successivamente utilizzato, il compilatore ha mostrato un errore sulla variabile non inizializzata. Dopo aver inizializzato in modo esplicito l'oggetto con «null», l'errore è scomparso. Grazie a te, ora so che è solo un bug di Visual Studio. –
@ Hi-Angel: No, non è un bug. È la differenza tra un * campo * e una variabile locale. Un campo ha un valore predefinito e può essere utilizzato senza che sia mai stato impostato - una variabile locale * non può * essere letta fino a quando non viene assegnata definitivamente. –