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.FirstName
。std?.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
。
本文内容总结: