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

C# 基礎入門:while 迴圈語句完整指南與文件讀取實戰

     編輯:關於C#

while 迴圈語法與執行流程

while (booleanExpression) {
    statement; // 或語句塊 { ... }
}

執行邏輯:

  1. 求值 `booleanExpression` (必須為 `bool` 類型)。
  2. 為 `true` → 執行 `statement` → 回到步驟 1。
  3. 為 `false` → 退出迴圈,執行後續代碼。

關鍵點:

  • 條件必須放在 `()` 中。
  • 首次判斷為 `false` 則**一次不執行**。
  • 多條語句必須用 `{ }` 包裹成塊。
  • 迴圈體內**必須有讓條件最終變 false 的邏輯** (遞增計數器、讀取下一行等),否則死循環。

基礎示例:計數器迴圈

int i = 0;
while (i != 10) {
    Console.WriteLine(i);
    i++; // 關鍵:更新哨兵變量,最終使條件為 false
}
// 輸出 0 到 9
💡 `i` 稱作**哨兵變量**,控制迴圈次數。

進階寫法:合併讀取與判斷

string line;
while ((line = reader.ReadLine()) != null) {
    Console.WriteLine(line);
}
// 等價於
string line;
while (true) {
    line = reader.ReadLine();
    if (line == null) break;
    Console.WriteLine(line);
}

利用賦值表達式的值 (賦值結果為賦入的值) 簡化代碼。

實戰項目:文本文件查看器 (WinForms)

場景:用戶通過 `OpenFileDialog` 選擇文件,逐行讀取顯示在多行 `TextBox` 中。

界面佈局

  • `Button` (btnOpen) → 觸發 `OpenFileDialog`
  • `TextBox` (txtFilename) → 顯示文件名
  • `TextBox` (txtContent, Multiline=true, ScrollBars=Vertical) → 顯示內容
  • `OpenFileDialog` (ofd) 組件

核心代碼

using System.IO;

private void ofd_FileOk(object sender, CancelEventArgs e) {
    string fullPath = ofd.FileName;
    var fileInfo = new FileInfo(fullPath);
    txtFilename.Text = fileInfo.Name; // 僅文件名
    
    txtContent.Text = ""; // 清空舊內容
    
    // 1. 打開文本讀取器
    using (TextReader reader = fileInfo.OpenText()) { // 自動關閉/釋放
        // 2. 逐行讀取迴圈
        string line;
        while ((line = reader.ReadLine()) != null) {
            txtContent.Text += line + Environment.NewLine; // 追加行 + 換行
        }
        // using 區塊結束自動調用 reader.Close()
    }
}

關鍵類說明

  • FileInfo:封裝文件路徑操作,提供 `OpenText()` 返回 `StreamReader` (繼承 `TextReader`)。
  • TextReader/StreamReader:逐字符/逐行讀取文本流。`ReadLine()` 返回不含換行符的行內容,EOF 返回 `null`。
  • using 語句:確保 `IDisposable` 資源 (文件句柄) 及時釋放,即使發生異常。

常見錯誤與調試技巧

錯誤現象原因修正
迴圈不結束未更新條件變量 (如忘記 `i++` 或 `ReadLine()`)檢查迴圈體末尾是否有推進邏輯
少讀最後一行先判斷後讀取,導致 EOF 行未處理採用 `while ((line = reader.ReadLine()) != null)` 模式
文件被佔用無法刪除未調用 `Close()`/`Dispose()`務必用 `using` 或 `try/finally` 關閉
中文亂碼編碼不匹配 (預設 UTF-8,文件為 GB2312)`new StreamReader(path, Encoding.GetEncoding("GB2312"))`

對比:while vs do-while vs for

迴圈類型判斷時機適用場景
while**前置**判斷次數未知、可能零次執行 (如讀取流、輪詢條件)
do-while**後置**判斷**至少執行一次** (如菜單顯示、輸入驗證)
for前置判斷 + 內置初始化/遞增已知次數、計數器驅動 (如遍歷數組、索引迴圈)

最佳實踐清單

  • ✅ **首選 `while ((line = reader.ReadLine()) != null)`** 讀取文本行,簡潔且正確處理 EOF。
  • ✅ **始終用 `using` 包裹 `StreamReader`/`FileStream`**,保證資源釋放。
  • ✅ **大文件逐行處理**,避免 `File.ReadAllLines` 一次性載入內存 (OOM 風險)。
  • ✅ **異步讀取** (`.NET Core 2.1+`):`await foreach (var line in File.ReadLinesAsync(path))` 非阻塞 UI。
  • ✅ **編碼顯式指定**:`new StreamReader(path, Encoding.UTF8)` 或 `Encoding.GetEncoding("GB2312")`。
  • ✅ **StringBuilder 替代 `+=` 拼接**:大量行拼接時 `txtContent.Text += ...` 性能差,改用 `StringBuilder` 最後賦值。

StringBuilder 優化版

using (var reader = fileInfo.OpenText()) {
    var sb = new StringBuilder();
    string line;
    while ((line = reader.ReadLine()) != null) {
        sb.AppendLine(line);
    }
    txtContent.Text = sb.ToString(); // 一次性賦值
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved