視窗/屏幕截圖適用於截圖、批註等工具場景,時時獲取視窗/屏幕圖像數據流呢,下麵講下視頻會議共用桌面、遠程桌面這些場景是如何實現畫面錄製的。 常見的屏幕畫面時時採集方案,主要有GDI、WGC、DXGI。 GDI GDI(Graphics Device Interface)就是使用user32下Wind ...
本文將來和大家聊聊在 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
更多技術博客,請參閱 博客導航
博客園博客只做備份,博客發佈就不再更新,如果想看最新博客,請訪問 https://blog.lindexi.com/
如圖片看不見,請在瀏覽器開啟不安全http內容相容
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發佈,但務必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含鏈接:https://www.cnblogs.com/lindexi ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我[聯繫](mailto:[email protected])。