本文將來和大家聊聊在 dotnet C# 裡面的基礎的 for 迴圈語法的寫法
使用 for 作為迴圈的寫法是在程式設計裡面常用的程式碼寫法。比如說我有一個名為 Foo 的型別,這個型別提供了一個名為 GetCount 的方法,這個方法可以緩慢的獲取 Foo 裡面的一個代表數量的值。且在 Foo 型別裡面提供了索引器,可以根據傳入的下標序號返回一個字串,例子程式碼如下
class Foo
{
public string this[int index]
{
get
{
return "Hello" + index;
}
}
public int GetCount()
{
// 模擬一個耗時的操作
Thread.Sleep(100);
return 100;
}
}
假定現在的需求是需要遍歷 Foo 返回的數量,透過 Foo 的索引器獲取其值。那麼最簡單的寫法大概如下
var foo = new Foo();
for (int i = 0; i < foo.GetCount(); i++)
{
var value = foo[i];
_ = value;
}
如以上程式碼所示,在 for 迴圈裡面,透過在條件語句裡面的 i < foo.GetCount()
判斷是否超過了 Foo 數量範圍,從而完成迴圈條件判斷
以上程式碼的 _ = value;
只是用於示例表示取出了 value 值,模擬拿出去用。這裡的 _ =
表示的是右值不受關注,不受使用,只是一個讓編譯器開森的程式碼,讓編譯器不要警告說 value 區域性變數沒地方使用而已
由於 Foo 的 GetCount 方法是耗時的,以上程式碼將會在每次迴圈判斷條件語句裡面呼叫 GetCount 方法。無疑這將會是低效率的
咱又提前知道了 GetCount 方法的返回值不會在迴圈過程中變更,一個比較好的方法就是提前先取出 GetCount 方法的返回值,將返回值存放到區域性變數裡面,如此即可減少此方法的呼叫
var fooCount = foo.GetCount();
for (int i = 0; i < fooCount; i++)
{
var value = foo[i];
_ = value;
}
如上述程式碼所示,可以看到在 for 分支判斷語句裡面只使用 i < fooCount
判斷邏輯,不再需要每次判斷時都呼叫 GetCount 方法,可以提升不少的效能
然而以上程式碼卻多引入了一行 var fooCount = foo.GetCount();
程式碼,程式碼行數上比不過最初的程式碼。在不關注耗時或效能的程式碼上,這樣看起來最初的迴圈程式碼會比上述程式碼更加簡短
如果只是為了減少程式碼行,那可以將 var fooCount = foo.GetCount();
放入到 for 迴圈的初始化表示式語句裡面編寫,如下面程式碼
for (int i = 0, count = foo.GetCount(); i < count; i++)
{
var value = foo[i];
_ = value;
}
以上的 for 迴圈語句的初始化表示式的程式碼就是 int i = 0, count = foo.GetCount()
同時初始化 i 和 count 兩個區域性變數
儘管以上兩個程式碼看起來行數不相同,但從底層上沒有差別
以上例子只是告訴大家不要有程式設計的習慣,誤以為 for 迴圈的初始化語句只能初始化迴圈的索引區域性變數。其實在 for 迴圈的初始化語句裡面可以放入你開森的邏輯
本文以上程式碼放在 github 和 gitee 上,可以使用如下命令列拉取程式碼。我整個程式碼倉庫比較龐大,使用以下命令列可以進行部分拉取,拉取速度比較快
先建立一個空資料夾,接著使用命令列 cd 命令進入此空資料夾,在命令列裡面輸入以下程式碼,即可獲取到本文的程式碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin f005404efbf000f19880fad4f03cc2c6c242e967
以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令列繼續輸入以下程式碼,將 gitee 源換成 github 源進行拉取程式碼。如果依然拉取不到程式碼,可以發郵件向我要程式碼
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin f005404efbf000f19880fad4f03cc2c6c242e967
獲取程式碼之後,進入 Workbench/KerewaykeehabalheaHebalhereda 資料夾,即可獲取到原始碼
更多基礎語法請看 https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/iteration-statements
更多技術部落格,請參閱 部落格導航