c# – 为什么在构造函数中抛出异常会导致空引用?

为什么在构造函数中抛出异常会导致空引用?
例如,如果我们运行代码低于教师的值为null,而st.teacher不是(创建一个教师对象)。为什么?

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;
  }

}
最佳答案
构造函数永远不会完成,因此赋值永远不会发生。这不是从构造函数返回null(或者有一个“空对象” – 没有这样的概念)。只是你从来没有为老师赋予新的价值,所以它保留了以前的价值。

例如,如果您使用:

Teacher teacher = new Teacher("This is valid", new Student());
Student st = new Student();
try
{
    teacher = new Teacher("", st);
}
catch (... etc ...)

那么你还会有“这是有效的”老师。该名称变量仍然不会在该教师对象中分配一个值,因为您的教师构造函数缺少一行,例如:

this.name = name;

转载注明原文:c# – 为什么在构造函数中抛出异常会导致空引用? - 代码日志