C# - “对象引用未设置到对象的实例”

2023-12-22

我目前正在尝试在“MyMethod”使用引用之前检查引用是否为空:

if (School.ClassRoom.Pupil.Age != null)
        {
            MyMethod(School.ClassRoom.Pupil.Age);
        }

但是,我仍然在第一行收到“对象引用未设置为对象实例”的信息,因为不仅年龄为空,而且学生和教室有时也为空。

我在使用 Try、Catch、Finally 时遇到了同样的问题,因为我在 Try 代码段中遇到了相同的错误。

我不想每次使用此方法时都必须检查每个 ClassRoom 是否为 null,然后检查每个 Pupil 是否为 null,然后检查每个 Age 是否为 null。

有没有更简单的方法来做到这一点?


注:下面的答案写于 2010 年,早在空条件C# 6 中引入了运算符。


听起来您正在寻找类似 Groovy 的空安全解引用运算符之类的东西,它可以让您编写if (School?.ClassRoom?.Pupil?.Age != null)- 但 C# 在 C# 6 之前没有这样的东西。

我怕你have检查每个属性是否无效,假设它可以be null:

if (School != null && School.ClassRoom != null && School.ClassRoom.Pupil != null
    && School.ClassRoom.Pupil.Age != null)
{
    MyMethod(School.ClassRoom.Pupil.Age);
}

当然,你可以把这整个if块将方法调用本身包含在辅助方法中,然后调用它。

假设每个属性都有效be开头为空。如果您能够设计您的类,甚至不允许空值 - 并且您在构造函数等中验证这一点 - 您的代码最终可能会变得更加干净。

值得注意的是,这里有两种替代方法 - Chris 在另一个答案中提出的方法是为每个属性创建一个“默认”对象;我usually发现最好始终要求在构造函数中提供“真实”值。没有真实数据的默认对象最终可能会导致错误,这些错误比错误更难追踪NullReferenceException问题,因为您可以愉快地长期使用“虚拟”数据,但最终得到错误的结果。肯定有这样的时候is然而,这是正确的做法——尤其是在收藏方面。这取决于实际情况。

编辑:萨伊德在评论中建议了一种扩展方法。我认为这会是这样的:

public static int? PupilAgeOrNull(this School school)
{
    return school != null && 
           school.ClassRoom != null && 
           school.ClassRoom.Pupil != null
           ? school.ClassRoom.Pupil.Age : null;
}

(适当调整类型。)

我绝对更喜欢尝试在其他地方保持非空值的想法,但是如果您需要它,这将做到这一点。但我感觉不对。这种直觉的核心是你一开始就在浏览三到四个属性——这感觉像是违反了德墨忒耳定律 http://en.wikipedia.org/wiki/Law_of_Demeter大部头书。现在我不是一个对这些事情教条的人,而是放置一个扩展方法on School对于这么长的属性路径,我感觉太具体了。

另一种选择 - 在我看来也有点令人讨厌 - 是编写三种不同的扩展方法:

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

然后你可以写:

int? age = School.ClassRoomOrNull().PupilOrNull().AgeOrNull();
if (age != null)
{
    MyMethod(age);
}

这意味着扩展方法School并不是那么具体。你仍然有一个很长的方法调用链,如果可能的话,我仍然会尝试重新设计以避免这种情况,但至少没有那么紧密的联系School to School.ClassRoom.Pupil.Age.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# - “对象引用未设置到对象的实例” 的相关文章

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 我如何为特定列中的每个值添加总计行,该行基于其他列进行计算,

    假设我有这个数据框 我想要的是这个 我想要做的是创建根据月份变量进行分组的行 然后获取总变量的总和 以及该月所有值的 days month 变量的唯一值 我只是想知道是否有一种简单的方法可以做到这一点 不涉及多次传播并收集装饰总计 我必须在
  • C# 2D 游戏编程教程

    我想学习用 C 编写 2D 游戏 有哪些面向初学者 针对 C 编写 最好使用 GDI 或同样简单的东西 的最佳教程 我依靠这个社区的经验来引导我走向最好的方向 Books 开始 NET 游戏编程 https rads stackoverfl
  • Python Svgwrite 和字体样式/大小

    我正在尝试制作一个连接到网络抓取工具的 SVG 文件 如何使用 svgwrite 更改字体和文本大小 我知道我必须定义 CSS 样式并以某种方式将其连接到文本对象 但这是如何制作的呢 这是我到目前为止的代码 import svgwrite
  • 存储部分和的二叉树:名称和现有实现

    Consider a sequence of n positive real numbers ai and its partial sum sequence si Given a number x 0 sn we have to find
  • 使用脱字符号 (^) 拆分长命令不适用于批处理文件中的管道 (|)

    答案关于这个问题 https stackoverflow com q 69068 3705191声明可以通过使用插入符将长命令分成多行 一个答案提供了技术描述 插入符号 and 换行符其后的被删除完全来自命令 然而 这似乎并不总是有效pip
  • 如何处理 C 中的 free() 错误?

    假设我已经使用了free 函数来释放内存 由于多种原因 我不允许这样做 如何阻止我的 C 应用程序崩溃并生成错误并继续执行 我这里没有 try catch 类型的规定 例如 C java 有什么办法可以忽略这个错误并继续执行吗 If yes
  • React Native 中的 OCR 库。可以使用 tesseract.js 吗?

    我应该使用什么免费库来在 React Native 中进行扫描 我需要一个库来扫描文档 我想在相机上设置帧大小并从照片加载数据 我找到了一个库 但它不会再维护了 https github com jonathanpalma react na
  • git:如何重新同步 fork?

    我们需要遵循的工作流程是这样的 将 github 上的项目分叉到您自己的私人 githib 帐户中 将分叉项目克隆到本地计算机 在本地计算机上创建 主控的 功能分支 将分支提交到分叉存储库 在主存储库上向分叉存储库上的新分支发出拉取请求 这
  • C# 与 Java HmacSHA1,然后是 base64 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个 java 代码示例 用于使
  • 脚本上的 BigQuery 请求超时错误

    在 BigQuery 上运行查询作业时出现错误 消息 gt 请求超时 请再试一次 原因 gt 超时 位置 gt 脚本 我们将按照要求再次运行它 但由于它需要 1 2 小时才会超时 因此如果我们知道问题是什么 这样我们就可以避免它 这将很有帮
  • 字段列表中的未知列。 PHP+MySQL

    我试图将值添加到 phpmyadmin 中的表中 但收到错误 字段列表 中的未知列 这是我的代码
  • 使用 intel pin 工具的堆栈分配大小

    我有以下 c 代码 include
  • AttributeError:“unicode”对象没有属性“_sa_instance_state”

    我刚刚学习如何使用 SQLAlchemy 我正在尝试执行以下操作 但将标题和链接存储在两个单独的表中 temp Submissions title u Facebook Homepage link u http facebook com s
  • 如何(重新)调用已初始化对象的构造函数?

    我正在编写一些代码来检查特定的 MIDI 设备是否已插入 如果没有 则代码每 5 秒重新检查一次 直到插入为止 我的问题出现在检查设备列表时 外部库没有重新检查端口的功能 因为它只在类的构造函数中执行此操作 我能看到让我的代码重新检查设备列
  • hibernate 选择所有投影分组依据

    在hibernate Criteria规范中 如果我想对表中的属性进行分组 我必须使用Projections groupProperty 问题是我无法选择表中的所有字段 我想要的是 SELECT FROM 实体 GROUP BY 字段 如果
  • C Python API 扩展忽略 open(errors="ignore") 并始终抛出编码异常

    给定一个文件 myfiles file with invalid encoding txt无效的 UTF8 为 parse this correctly F B r also parse this correctly 我正在使用内置的Pyt
  • 使用CMD终端时Python无法显示希伯来语

    我正在尝试在我的代码中使用希伯来字符 但我的终端 CMD 不支持希伯来语 而是只显示随机问号 例如 gt gt gt Print result 编辑 CMD 控制台的默认字体中根本没有希伯来字母 您只需更改字体即可显示希伯来语 这将影响命令
  • powershell出现错误时如何获取错误代码?

    我的片段是这样的 msg Remove Item Recurse Force C users bkp 2 gt 1 if LASTEXITCODE eq 1 Encountered error during Deleting the Fol
  • InternetReadFile 的常见平均缓冲区大小是多少?

    我在 Delphi 中使用 WinInet h 通过 HTTP 下载平均大小在 30 KB 到 1 5 MB 之间的文件 var Buf array 0 BUFFER SIZE 1 of Byte while BOOL InternetRe
  • C# - “对象引用未设置到对象的实例”

    我目前正在尝试在 MyMethod 使用引用之前检查引用是否为空 if School ClassRoom Pupil Age null MyMethod School ClassRoom Pupil Age 但是 我仍然在第一行收到 对象引