Cau*_*tix 2 c# null exception-handling
我正在尝试检查引用是否为空,然后'MyMethod'使用它:
if (School.ClassRoom.Pupil.Age != null)
{
MyMethod(School.ClassRoom.Pupil.Age);
}
Run Code Online (Sandbox Code Playgroud)
但是,我仍然在第一行得到"对象引用未设置为对象的实例",因为不仅Age为null,而且Pupil和ClassRoom有时也为null.
我使用Try,Catch,最后得到了相同的问题,因为我在Try代码中遇到了同样的错误.
我不想要检查每个ClassRoom为null,然后每个Pupil为null,然后每次Age为null,每次我想使用此方法.
有更简单的方法吗?
听起来你像是在使用Groovy的null-safe dereferencing运算符,它可以让你写if (School?.ClassRoom?.Pupil?.Age != null)- 但C#没有这样的东西.
我担心你必须检查每个属性是否为 null ,假设它可以为 null:
if (School != null && School.ClassRoom != null && School.ClassRoom.Pupil != null
&& School.ClassRoom.Pupil.Age != null)
{
MyMethod(School.ClassRoom.Pupil.Age);
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以将整个if块(包括方法调用本身)放在辅助方法中,然后调用它.
这是假设每个属性的有效开始时为 null.如果你能够设计你的类以便甚至不允许空值 - 并且你在contsructors等中验证它 - 你的代码可能最终变得更加清晰.
值得注意的是,这里有两种替代方法 - 克里斯在另一个答案中提出的方法是为每个属性创建一个"默认"对象; 我通常发现总是要求在构造函数中提供"真实"值更好.没有真实数据的默认对象最终会导致比NullReferenceException问题更难跟踪的错误,因为您可以很长时间地使用"虚拟"数据,并且最终得到错误的结果.然而,肯定有时候这是正确的事情 - 特别是在收藏方面.这取决于实际情况.
编辑:Saeed在评论中建议了一种扩展方法.我假设这将是这样的:
public static int? PupilAgeOrNull(this School school)
{
return school != null &&
school.ClassRoom != null &&
school.ClassRoom.Pupil != null
? school.ClassRoom.Pupil.Age : null;
}
Run Code Online (Sandbox Code Playgroud)
(适当调整类型.)
我绝对更喜欢尝试在其他地方保持非null的想法,但如果你需要它,它会这样做.但我感觉不对.这种直觉的核心是你要开始使用三到四个属性 - 这对我来说就像违反了得墨忒耳法.现在我不是一个会对这些事情采取教条的人,但对于我来说,对于如此漫长的属性路径来说,延伸方法对School我来说太过具体了.
另一种选择 - IMO也有些讨厌 - 是编写三种不同的扩展方法:
public static ClassRoom ClassRoomOrNull(this School school)
{
return school == null ? null : school.ClassRoom;
}
public static Pupil PupilOrNull(this ClassRoom classRoom)
{
return classRoom == null ? null : classRoom.Pupil;
}
public static int? AgeOrNull(this Pupil pupil)
{
return pupil == null ? null : pupil.Age;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以写:
int? age = School.ClassRoomOrNull().PupilOrNull().AgeOrNull();
if (age != null)
{
MyMethod(age);
}
Run Code Online (Sandbox Code Playgroud)
这意味着扩展方法School并不是那么具体.你还有方法调用的长链,而且我仍然试图重新设计尽可能地避免这种情况,但至少没有从相当如此严密的领带School来School.ClassRoom.Pupil.Age.
| 归档时间: |
|
| 查看次数: |
3982 次 |
| 最近记录: |