欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 循環(huán)判斷會進(jìn)來幾次的實(shí)現(xiàn)代碼

 更新時間:2018年06月19日 10:02:07   作者:lindexi  
這篇文章主要介紹了C# 循環(huán)判斷會進(jìn)來幾次的實(shí)現(xiàn)代碼,代碼中就一個循環(huán),循環(huán)的判斷是從一個函數(shù)獲取值,需要的朋友可以參考下

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

先來寫一個簡單的代碼, 就一個循環(huán),循環(huán)的判斷是從一個函數(shù)獲取值

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("進(jìn)入");
      return 10;
    }
  }

通過 Main 調(diào)用 BirmeruLerrayjairbay ,這個函數(shù)里面的 for 判斷是 DaydrearNenawerlai 拿到一個值,我嘗試在 release 運(yùn)行,結(jié)果每個判斷都需要進(jìn)入 DaydrearNenawerlai 函數(shù),請看輸出

進(jìn)入
第0個逗比
進(jìn)入
第1個逗比
進(jìn)入
第2個逗比
進(jìn)入
第3個逗比
進(jìn)入
第4個逗比
進(jìn)入
第5個逗比
進(jìn)入
第6個逗比
進(jìn)入
第7個逗比
進(jìn)入
第8個逗比
進(jìn)入
第9個逗比

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

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

public void BirmeruLerrayjairbay()
    {
      var mowraiTepalor = DaydrearNenawerlai();
      for (int i = 0; i < mowraiTepalor; i++)
      {
        Console.WriteLine("第" +i.ToString()+"個逗比");
      }
    }

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

 

我添加了斷點(diǎn),在斷點(diǎn)輸出 123 然后運(yùn)行

 

這時我發(fā)現(xiàn)運(yùn)行沒有輸出 123 也就是函數(shù)沒有進(jìn)來,我再次添加斷點(diǎn),跟著函數(shù)也沒有訪問

所以這時的 DaydrearNenawerlai 函數(shù)就被優(yōu)化掉了

我和一個小伙伴說了這個問題,他說是被 IL 優(yōu)化了,我一點(diǎn)不相信,所以我就去看 IL 代碼

從下面的代碼

public void BirmeruLerrayjairbay()
    {
      for (int i = 0; i < DaydrearNenawerlai(); i++)
      {
        Console.WriteLine("第" +i.ToString()+"個逗比");
      }
    }
    /// <summary>
    /// 進(jìn)入lindexi.github.io可以看到更多博客
    /// </summary>
    /// <returns></returns>
    public static int DaydrearNenawerlai()
    {
      return 10;
    }

轉(zhuǎn) IL 可以看到下面代碼,我會在 IL 添加很多注釋,所以很容易看懂。

.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
  // 這里就是進(jìn)入循環(huán) 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
   // 調(diào)用 int.ToString ,使用的是實(shí)例的方法
   IL_000b: call     instance string [mscorlib]System.Int32::ToString()
   // 把"個逗比"放入棧
   IL_0010: ldstr    "個逗比"
   // 調(diào)用字符串組合方法,組合三個字符串,返回一個字符串。
   // 把剛才入棧三個字符串出棧,返回的字符串入棧
   IL_0015: call     string [mscorlib]System.String::Concat(string, string, string)
   // 調(diào)用 Console.WriteLine ,從棧拿到一個字符串輸出
   IL_001a: call     void [mscorlib]System.Console::WriteLine(string)
   // 下面是 i++ 代碼
   // [23 55 - 23 58]
   // 將指定索引處的局部變量加載到計算堆棧上,這里的索引是 0 ,在代碼的變量是 i 所以把 i 加載到計算堆棧
   IL_001f: ldloc.0   // i
   // 將整數(shù)值 1 作為 int32 推送到計算堆棧上
   IL_0020: ldc.i4.1   
   // 從堆棧出棧兩個數(shù)值進(jìn)行相加,返回的值放在棧
   IL_0021: add     
   // 從計算堆棧的頂部彈出當(dāng)前值并將其存儲到指定索引處的局部變量列表中,這里索引是 0 ,在代碼的變量是 i ,所以 i = i + 1 的代碼就是這樣做
   IL_0022: stloc.0   // i
   // 從堆棧加載 i ,把 i 入棧
   // [23 29 - 23 53]
   IL_0023: ldloc.0   // i
   // 調(diào)用方法 DaydrearNenawerlai 拿到返回值
   IL_0024: call     int32 MuhoubearWhedoofi.MeepeMorcear::DaydrearNenawerlai()
   // 如果第一個值小于第二個值,則將控制轉(zhuǎn)移到目標(biāo)指令,這里的第一個值就是 i ,第二個值就是 DaydrearNenawerlai 的返回值。跳轉(zhuǎn)到標(biāo)簽 IL_0004 ,如果沒有小于,就繼續(xù)代碼。
   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

從上面代碼可以發(fā)現(xiàn),實(shí)際 DaydrearNenawerlai 沒有被優(yōu)化掉,還是有這個方法。

總結(jié)

以上所述是小編給大家介紹的C# 循環(huán)判斷會進(jìn)來幾次的實(shí)現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • C#和lua相互調(diào)用的方法教程

    C#和lua相互調(diào)用的方法教程

    lua是一種腳本語言,可以方便的移植到各種宿主語言中,并且可以支持熱更新,在游戲開發(fā)中也能當(dāng)做主要的語言來編寫游戲的邏輯,所以這篇文章主要給大家介紹了關(guān)于C#和lua相互調(diào)用的方法教程,需要的朋友可以參考下。
    2017-11-11
  • c#中利用Tu Share獲取股票交易信息

    c#中利用Tu Share獲取股票交易信息

    這篇文章主要介紹了c#中利用Tu Share獲取股票交易信息,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 詳解如何選擇使用ArrayList、HashTable、List、Dictionary數(shù)組

    詳解如何選擇使用ArrayList、HashTable、List、Dictionary數(shù)組

    本文詳細(xì)介紹了ArrayList、HashTable、List、Dictionary的用法,以及什么情況選用該數(shù)組,以便提高開發(fā)效率。希望對大家有所幫助
    2016-11-11
  • C#讀取xml節(jié)點(diǎn)數(shù)據(jù)方法小結(jié)

    C#讀取xml節(jié)點(diǎn)數(shù)據(jù)方法小結(jié)

    這篇文章主要介紹了C#讀取xml節(jié)點(diǎn)數(shù)據(jù)的方法,實(shí)例總結(jié)了C#針對XML文件節(jié)點(diǎn)操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 詳解C#設(shè)計模式編程中生成器模式的使用

    詳解C#設(shè)計模式編程中生成器模式的使用

    這篇文章主要介紹了詳解C#設(shè)計模式編程中生成器模式的使用,生成器模式主張創(chuàng)建對象的過程和對象的表現(xiàn)應(yīng)該分離開來,需要的朋友可以參考下
    2016-02-02
  • C# Bitmap圖像處理加速的實(shí)現(xiàn)

    C# Bitmap圖像處理加速的實(shí)現(xiàn)

    本文主要介紹了C# Bitmap圖像處理加速的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • c#實(shí)現(xiàn)圖片的平移和旋轉(zhuǎn)示例代碼

    c#實(shí)現(xiàn)圖片的平移和旋轉(zhuǎn)示例代碼

    這篇文章主要給大家介紹了關(guān)于c#實(shí)現(xiàn)圖片的平移和旋轉(zhuǎn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 時間戳與時間相互轉(zhuǎn)換(php .net精確到毫秒)

    時間戳與時間相互轉(zhuǎn)換(php .net精確到毫秒)

    本文給大家分享的時間戳與時間相互轉(zhuǎn)換(php .net精確到毫秒) ,感興趣的朋友一起學(xué)習(xí)吧
    2015-09-09
  • C#?WPF使用GDI實(shí)現(xiàn)截屏功能

    C#?WPF使用GDI實(shí)現(xiàn)截屏功能

    這篇文章主要為大家詳細(xì)介紹了C#?WPF如何使用GDI實(shí)現(xiàn)截屏功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • C#中登錄窗體和歡迎窗體關(guān)閉方法分析

    C#中登錄窗體和歡迎窗體關(guān)閉方法分析

    這篇文章主要介紹了C#中登錄窗體和歡迎窗體關(guān)閉方法,實(shí)例分析了C#中登錄窗體和歡迎窗體關(guān)閉時出現(xiàn)錯誤的原因與解決方法,是C#項(xiàng)目開發(fā)中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12

最新評論