C# 中的 NullReferenceException

本文关键字:NullReferenceException 中的 | 更新日期: 2023-09-22 14:26:55

NullReferenceException是在访问 null 对象时将引发的异常。

以下示例显示了引发NullReferenceException的代码:

示例: NullReferenceException

public class Program
{
	public static void Main()
	{
		IList<string> cities = null;
		DisplayCities(cities);
	}
	public static void DisplayCities(IList<string> cities)
	{
		foreach (var city in cities)
		{
			Console.WriteLine(city);
		}
	}
}

在上面的示例中,在使用 foreach 循环访问城市列表时,将在 DisplayCities() 函数中抛出NullReferenceException,因为城市列表为 null。如果 DisplayCities() 函数的调用方传递空值IList,则它将引发NullReferenceException

修复空引用异常的解决方案(Solutions to fix the NullReferenceException)

若要防止NullReferenceException异常,请在访问引用类型参数之前检查它们是否为 null。

解决方案 1:使用 if 条件检查对象是否包含 null 值,如下所示:

示例: Prevent NullReferenceException by Checking NUll

public class Program
{
	public static void Main()
	{
		IList<string> cities = null;
		DisplayCities(cities);
	}
	public static void DisplayCities(IList<string> cities)
	{
		if (cities == null) //check null before accessing
		{
			Console.WriteLine("No Cities");
			return;
		}
		foreach (var city in cities)
		{
			Console.WriteLine(city);
		}
	}
}

在上面的示例中,if(cities == null)检查 cities 对象是否为 null。如果为 null,则显示相应的消息并从函数返回。

解决方案 2:在 .NET 5 中,使用 null 条件运算符 ?. ,如下所示:

示例: Prevent NullReferenceException using ?. operator

public class Program
{
	public static void Main()
	{
		Student std = null;
		Display(std);
		
		std = new Student(){ FirstName = "Vinod", LastName = "Dhar"};
		Display(std);
	}
	public static void Display(Student std)
	{
		Console.WriteLine("Student Info:");
		Console.WriteLine(std?.FirstName); //use ?. operator 
		Console.WriteLine(std?.LastName); // use ?. operator
	}
}
public class Student
{
	public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

在上面的例子中,std?.FirstName就像if(std != null) std.FirstNamestd?.FirstName检查std是否不为 null,则仅访问 FirstName 属性。

解决方案 3:在 .NET 4.x 及更高版本中,使用 Null 合并运算符??来防止异常,如下所示:

示例: Prevent NullReferenceException using ??

public class Program
{
	public static void Main()
	{
		IList<string> cities = null;
		DisplayCities(cities);
	}
	public static void DisplayCities(IList<string> cities)
	{
		foreach (var city in cities?? new List())
		{
			Console.WriteLine(city);
		}
	}
}

在上面的示例中,?? 是一个 null 合并运算符,用于检查对象是否为 null,如果为 null,则创建一个对象。如果 foreach 循环中的cities为 null,则城市?? new List<string>()创建一个新的列表对象。 \t因此,不会提出NullReferenceException


本文内容总结: