云服务器做网站好吗区块链外包开发
2026/4/16 22:47:31 网站建设 项目流程
云服务器做网站好吗,区块链外包开发,大型建站网站,做的网站适应屏幕大小核心区别概述特性yield return nullyield break主要作用暂停协程#xff0c;等待下一帧继续立即终止协程执行执行流程协程暂停#xff0c;稍后恢复协程完全结束#xff0c;不再执行返回值返回 null#xff08;等待一帧#xff09;结束迭代器#xff0c;不返回值后续代码协…核心区别概述特性yield return nullyield break主要作用暂停协程等待下一帧继续立即终止协程执行执行流程协程暂停稍后恢复协程完全结束不再执行返回值返回 null等待一帧结束迭代器不返回值后续代码协程内后续代码会在下一帧执行协程内后续代码永远不会执行详细解释与示例1.yield return null- 暂停并继续csharpIEnumerator ExampleYieldNull() { Debug.Log(第1步 - 开始); // 暂停一帧 yield return null; Debug.Log(第2步 - 一帧后执行); // 这行会执行 // 再暂停一帧 yield return null; Debug.Log(第3步 - 再一帧后执行); // 这行也会执行 } // 输出结果 // 第1步 - 开始 // (等待一帧) // 第2步 - 一帧后执行 // (等待一帧) // 第3步 - 再一帧后执行2.yield break- 立即终止csharpIEnumerator ExampleYieldBreak() { Debug.Log(第1步 - 开始); // 立即终止协程 yield break; Debug.Log(第2步 - 这行永远不会执行); // ❌ 不会执行 yield return null; Debug.Log(第3步 - 这行也不会执行); // ❌ 不会执行 } // 输出结果 // 第1步 - 开始 // (协程立即结束没有后续输出)实际应用场景对比场景1条件性提前退出csharpIEnumerator LoadDataWithTimeout(float timeout) { float startTime Time.time; while (!IsDataLoaded()) { // 检查超时 if (Time.time - startTime timeout) { Debug.Log(加载超时提前退出); yield break; // 立即终止协程 } // 等待一帧后继续检查 yield return null; } Debug.Log(数据加载完成); // 如果超时这行不会执行 }场景2循环中的区别csharp// 使用 yield return null IEnumerator LoopWithYieldNull() { for (int i 0; i 5; i) { if (i 2) { yield return null; // 只是暂停一帧循环继续 } Debug.Log($循环: {i}); yield return new WaitForSeconds(0.5f); } Debug.Log(循环完成); } // 使用 yield break IEnumerator LoopWithYieldBreak() { for (int i 0; i 5; i) { if (i 2) { yield break; // 立即终止整个协程 } Debug.Log($循环: {i}); yield return new WaitForSeconds(0.5f); } Debug.Log(这行永远不会执行); // ❌ 不会执行 }与普通break的区别csharpIEnumerator CompareWithBreak() { for (int i 0; i 5; i) { if (i 2) { break; // 只跳出循环协程继续执行后面的代码 } Debug.Log($循环内: {i}); yield return null; } Debug.Log(循环后的代码); // ✅ 这行会执行 yield return null; Debug.Log(协程结束); // ✅ 这行也会执行 } IEnumerator CompareWithYieldBreak() { for (int i 0; i 5; i) { if (i 2) { yield break; // 立即终止整个协程 } Debug.Log($循环内: {i}); yield return null; } Debug.Log(循环后的代码); // ❌ 这行不会执行 yield return null; Debug.Log(协程结束); // ❌ 这行也不会执行 }嵌套协程中的行为csharpIEnumerator ParentCoroutine() { Debug.Log(父协程开始); // 启动子协程 yield return StartCoroutine(ChildCoroutine()); Debug.Log(子协程完成后执行); // 注意这里 } IEnumerator ChildCoroutine() { Debug.Log(子协程第1步); yield return null; Debug.Log(子协程第2步); // 使用 yield return null yield return null; // 子协程暂停但会恢复 // 或者使用 yield break // yield break; // 子协程立即终止 Debug.Log(子协程第3步); // 如果前面是 yield break这行不会执行 } // 情况1: 子协程使用 yield return null // 输出: // 父协程开始 // 子协程第1步 // (等待一帧) // 子协程第2步 // (等待一帧) // 子协程第3步 // 子协程完成后执行 // 情况2: 子协程使用 yield break // 输出: // 父协程开始 // 子协程第1步 // (等待一帧) // 子协程第2步 // 子协程完成后执行 - 注意父协程继续执行重要注意事项1.资源清理问题csharpIEnumerator ProblematicCoroutine() { // 分配资源 var resource new ExpensiveResource(); try { // 一些操作... if (shouldStop) { yield break; // ❌ 危险可能导致资源泄漏 } // 更多操作... } finally { // 但 yield break 会跳过 finally 吗让我们测试... } // 清理资源如果 yield break这行不会执行 resource.Dispose(); } // 更好的做法 IEnumerator BetterCoroutine() { var resource new ExpensiveResource(); try { // 使用 using 语句确保清理 using (resource) { if (shouldStop) { yield break; // using 会确保 Dispose 被调用 } // 更多操作... } } finally { Debug.Log(finally 块执行); // 注意即使 yield breakfinally 也会执行 } }2.finally 块的行为csharpIEnumerator TestFinally() { try { Debug.Log(try 块开始); yield return null; Debug.Log(try 块中间); yield break; // 立即退出 Debug.Log(try 块结束 - 不会执行); } finally { Debug.Log(finally 块执行); // ✅ 这行会执行 } Debug.Log(协程最后 - 不会执行); }实用技巧1.组合使用csharpIEnumerator SmartCoroutine() { for (int i 0; i 100; i) { // 每10帧检查一次退出条件 if (i % 10 0 ShouldExitEarly()) { yield break; } // 正常处理 ProcessFrame(i); // 每帧暂停 yield return null; } }2.带返回值的协程csharpIEnumeratorint CoroutineWithReturnValue() { yield return 1; yield return 2; if (someCondition) { yield break; // 提前结束不再返回 3 } yield return 3; } // 使用 var enumerator CoroutineWithReturnValue(); while (enumerator.MoveNext()) { Debug.Log(enumerator.Current); } // 如果提前 yield break就不会输出 3总结yield return null是协程的暂停按钮表示等待一帧后继续yield break是协程的停止按钮表示立即结束不再继续关键记忆点当你想要协程暂时等待时使用yield return null当你想要协程完全终止时使用yield breakyield break会跳过协程中后续所有代码但finally 块仍会执行在循环中yield break终止整个协程而普通break只跳出当前循环理解这两者的区别对于编写正确的协程逻辑至关重要特别是在资源管理和错误处理方面。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询