一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C# 循環判斷會進來幾次的實現代碼

C# 循環判斷會進來幾次的實現代碼

2022-02-24 14:19lindexi C#

這篇文章主要介紹了C# 循環判斷會進來幾次的實現代碼,代碼中就一個循環,循環的判斷是從一個函數獲取值,需要的朋友可以參考下

最近有小伙伴告訴我,在循環的判斷條件只會計算一次,本金魚不相信,于是就做了測試,本文記錄我做的測試。

先來寫一個簡單的代碼, 就一個循環,循環的判斷是從一個函數獲取值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class program
  {
    static void main(string[] args)
    {
      var meepemorcear = new meepemorcear();
      meepemorcear.birmerulerrayjairbay();
    }
  }
  class meepemorcear
  {
    public void birmerulerrayjairbay()
    {
      for (int i = 0; i < daydrearnenawerlai(); i++)
      {
        console.writeline("第" +i.tostring()+"個逗比");
      }
    }
    public int daydrearnenawerlai()
    {
      console.writeline("進入");
      return 10;
    }
  }

通過 main 調用 birmerulerrayjairbay ,這個函數里面的 for 判斷是 daydrearnenawerlai 拿到一個值,我嘗試在 release 運行,結果每個判斷都需要進入 daydrearnenawerlai 函數,請看輸出

進入
第0個逗比
進入
第1個逗比
進入
第2個逗比
進入
第3個逗比
進入
第4個逗比
進入
第5個逗比
進入
第6個逗比
進入
第7個逗比
進入
第8個逗比
進入
第9個逗比

也就是在 debug 或 release 下,for 里面的判斷都是需要執行,所以在 for 里的判斷如果寫了很長的計算,那么就會在每次循環都需要重新計算。即使每次計算出來的值都是一樣,也需要重新計算。

所以這樣看起來性能不如這樣寫,使用一個臨時的變量獲取判斷的值

?
1
2
3
4
5
6
7
8
public void birmerulerrayjairbay()
    {
      var mowraitepalor = daydrearnenawerlai();
      for (int i = 0; i < mowraitepalor; i++)
      {
        console.writeline("第" +i.tostring()+"個逗比");
      }
    }

但是很快,另一個小伙伴告訴我,你把輸出去掉,然后使用斷點,你再看看

C# 循環判斷會進來幾次的實現代碼

我添加了斷點,在斷點輸出 123 然后運行

C# 循環判斷會進來幾次的實現代碼

這時我發現運行沒有輸出 123 也就是函數沒有進來,我再次添加斷點,跟著函數也沒有訪問

所以這時的 daydrearnenawerlai 函數就被優化掉了

我和一個小伙伴說了這個問題,他說是被 il 優化了,我一點不相信,所以我就去看 il 代碼

從下面的代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void birmerulerrayjairbay()
    {
      for (int i = 0; i < daydrearnenawerlai(); i++)
      {
        console.writeline("第" +i.tostring()+"個逗比");
      }
    }
    /// <summary>
    /// 進入lindexi.github.io可以看到更多博客
    /// </summary>
    /// <returns></returns>
    public static int daydrearnenawerlai()
    {
      return 10;
    }

轉 il 可以看到下面代碼,我會在 il 添加很多注釋,所以很容易看懂。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
.method public hidebysig instance void
  birmerulerrayjairbay() cil managed
 {
  .maxstack 3
  .locals init (
   [0] int32 i
  )
  // 第 23 行 18 個字符到 27 個字符
  // [23 18 - 23 27]
  il_0000: ldc.i4.0
  // 定義 i ,代碼的 int i = 0; 
  il_0001: stloc.0   // i
  il_0002: br.s     il_0023
  // 這里就是進入循環 for ,在 il 不管 for 還是 while 都是差不多
  // start of loop, entry point: il_0023
   // [25 17 - 25 60]
   // 下面這個代碼就是 console.writeline("第" +i.tostring()+"個逗比"); 從代碼可以看到
   // 需要先申請"第"
   il_0004: ldstr    "第"
   // 然后把 i 放入棧
   il_0009: ldloca.s   i
   // 調用 int.tostring ,使用的是實例的方法
   il_000b: call     instance string [mscorlib]system.int32::tostring()
   // 把"個逗比"放入棧
   il_0010: ldstr    "個逗比"
   // 調用字符串組合方法,組合三個字符串,返回一個字符串。
   // 把剛才入棧三個字符串出棧,返回的字符串入棧
   il_0015: call     string [mscorlib]system.string::concat(string, string, string)
   // 調用 console.writeline ,從棧拿到一個字符串輸出
   il_001a: call     void [mscorlib]system.console::writeline(string)
   // 下面是 i++ 代碼
   // [23 55 - 23 58]
   // 將指定索引處的局部變量加載到計算堆棧上,這里的索引是 0 ,在代碼的變量是 i 所以把 i 加載到計算堆棧
   il_001f: ldloc.0   // i
   // 將整數值 1 作為 int32 推送到計算堆棧上
   il_0020: ldc.i4.1  
   // 從堆棧出棧兩個數值進行相加,返回的值放在棧
   il_0021: add    
   // 從計算堆棧的頂部彈出當前值并將其存儲到指定索引處的局部變量列表中,這里索引是 0 ,在代碼的變量是 i ,所以 i = i + 1 的代碼就是這樣做
   il_0022: stloc.0   // i
   // 從堆棧加載 i ,把 i 入棧
   // [23 29 - 23 53]
   il_0023: ldloc.0   // i
   // 調用方法 daydrearnenawerlai 拿到返回值
   il_0024: call     int32 muhoubearwhedoofi.meepemorcear::daydrearnenawerlai()
   // 如果第一個值小于第二個值,則將控制轉移到目標指令,這里的第一個值就是 i ,第二個值就是 daydrearnenawerlai 的返回值。跳轉到標簽 il_0004 ,如果沒有小于,就繼續代碼。
   il_0029: blt.s    il_0004
  // end of loop
  // [27 9 - 27 10]
  il_002b: ret    
 } // end of method meepemorcear::birmerulerrayjairbay
 .method public hidebysig static int32
  daydrearnenawerlai() cil managed
 {
  .maxstack 8
  // 把一個值 放入堆棧,放入的是 10 ,然后從棧拿到值返回
  // [36 13 - 36 23]
  il_0000: ldc.i4.s   10 // 0x0a
  il_0002: ret    
 } // end of method meepemorcear::daydrearnenawerlai

從上面代碼可以發現,實際 daydrearnenawerlai 沒有被優化掉,還是有這個方法。

總結

以上所述是小編給大家介紹的c# 循環判斷會進來幾次的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:https://lindexi.gitee.io/lindexi/post/C-循環的判斷會進來幾次.html

延伸 · 閱讀

精彩推薦
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
主站蜘蛛池模板: 欧美久久久久久久一区二区三区 | yy6080欧美三级理论 | 精品日本一区二区 | 男人天堂网页 | chinese男同志videos | 高清一级片 | 九色PORNY真实丨国产大胸 | 欧美brazzers| tobu8在线观看免费高清 | 国产精品久久现线拍久青草 | 亚洲精品一区二区三区在线看 | 91免费精品国自产拍在线可以看 | 欧美vpswindowssex 欧美va在线高清 | 欧美日日操 | 91精品国产综合久久福利 | 欧美草逼视频 | 国产成人欧美视频在线 | 国产精品一级片 | 香蕉久久夜色精品国产小优 | 香蕉免费看一区二区三区 | 蝴蝶传媒免费安装 | 久久re热在线视频精69 | 国产成人精品实拍在线 | 91色资源网在线观看 | 99久久精品99999久久 | 国产精品香蕉一区二区三区 | 国产拍拍拍免费专区在线观看 | 俄罗斯三级完整版在线观看 | 99热精品国产麻豆 | 男女精品视频 | 国产精品视频免费观看 | 91在线精品国产丝袜超清 | 精品久久久久久久久免费影院 | 三体动漫在线观看免费完整版2022 | 爸爸干女儿小说 | 97久久精品午夜一区二区 | 美艳教师刘艳第三部166 | 2019理论韩国理论中文 | 99国产高清久久久久久网站 | 国产成人无精品久久久久国语 | 亚洲成年www |