首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Head First C# 中文版 第二章 筆記:頁面 78-83 迴圈與延遲處理

     編輯:關於C#

前言

本文整理《Head First C#》中文版第二章關於迴圈控制、延遲問題與視覺化程式設計的關鍵概念與練習解答。

核心概念:for 迴圈與 while 迴圈的互動問題

當在 while 迴圈中巢狀 for 迴圈執行動畫或延遲效果時,會遇到回應性問題:


// 問題代碼
while (visible == true)
{
    for (int i = 0; i < 255; i++)
    {
        // 改變顏色
        // 此處無法檢查 visible 狀態
    }
    for (int i = 254; i >= 0; i--)
    {
        // 改變顏色
    }
}
// 使用者點擊關閉視窗,程式卡在 for 迴圈無法退出

解決方案:在 for 迴圈條件中加入旗標檢查


// 修正版
bool visible = true;

while (visible)
{
    for (int i = 0; i < 255 && visible; i++)
    {
        // 改變顏色
        // 此處可檢查 visible
        Application.DoEvents(); // 讓 UI 執行緒處理訊息
    }
    
    for (int i = 254; i >= 0 && visible; i--)
    {
        // 改變顏色
        Application.DoEvents();
    }
}

// 關閉視窗時設定 visible = false
private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    visible = false;
}

關鍵技術點

技術用途注意事項
Application.DoEvents()處理待處理的 Windows 訊息可能導致重入問題,謹慎使用
迴圈條件加入旗標讓迴圈可提前退出需配合 volatile 或記憶體柵欄
CancellationToken現代取消模式適用 Task/async 非同步程式
BackgroundWorker舊版背景執行緒已過時,建議用 Task.Run

現代化改寫:使用 Task 與 CancellationToken


using System.Threading;
using System.Threading.Tasks;

public class ModernAnimation
{
    private CancellationTokenSource _cts;
    private Task _animationTask;

    public async Task StartAnimationAsync()
    {
        _cts = new CancellationTokenSource();
        _animationTask = RunAnimationAsync(_cts.Token);
        await _animationTask;
    }

    public void StopAnimation()
    {
        _cts?.Cancel();
    }

    private async Task RunAnimationAsync(CancellationToken token)
    {
        try
        {
            while (!token.IsCancellationRequested)
            {
                // 漸變顏色 0-255
                for (int i = 0; i < 255 && !token.IsCancellationRequested; i++)
                {
                    UpdateColor(i);
                    await Task.Delay(10, token); // 非阻塞延遲
                }
                
                // 漸變顏色 255-0
                for (int i = 254; i >= 0 && !token.IsCancellationRequested; i--)
                {
                    UpdateColor(i);
                    await Task.Delay(10, token);
                }
            }
        }
        catch (OperationCanceledException)
        {
            // 正常取消
        }
    }

    private void UpdateColor(int value)
    {
        // 更新 UI 控制項顏色
        // 若在非 UI 執行緒,需用 Invoke/BeginInvoke
    }
}

練習解答重點

  1. 程式碼重新排序:理解類別、方法、指令的巢狀結構
  2. 條件判斷:if/else 控制流程,== 比較 vs = 指派
  3. 迴圈設計:while 迴圈需有明確退出條件,避免無限迴圈
  4. 變數宣告:型別 + 名字,使用前必須指派
  5. 方法呼叫:MessageBox.Show() 顯示對話方塊

常見初學者錯誤

錯誤原因正確寫法
if (x = 5)指派而非比較if (x == 5)
while (true) 無退出無限迴圈凍結 UI加入取消條件或用 Timer
迴圈中無 DoEventsUI 凍結無法回應加入 DoEvents 或改用非同步
變數未初始化編譯錯誤int x = 0; 或 var x = 0;

學習建議

  • 動手輸入代碼,不要只看
  • 故意製造錯誤,觀察編譯器/執行期錯誤訊息
  • 使用偵錯工具 (F9 中斷點、F10 逐行、F11 進入)
  • 理解「指令」、「方法」、「類別」、「命名空間」四層架構
  • 命名空間組織代碼,類別封裝行為,方法執行動作,指令操作資料

總結

第二章核心在於建立「程式 = 指令序列」的心智模型:指令在方法中執行,方法屬於類別,類別屬於命名空間。迴圈與條件控制流程,變數儲存資料。UI 程式設計需注意執行緒阻塞問題,現代開發優先使用 async/await 與 CancellationToken 取代 DoEvents 與旗標變數。理解這些基礎概念,是後續學習物件導向、事件驅動、非同步程式設計的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved