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

改進(jìn)c# 代碼的五個(gè)技巧(一)

 更新時(shí)間:2021年01月04日 14:31:08   作者:碼農(nóng)譯站  
這篇文章主要介紹了改進(jìn)c# 代碼的五個(gè)技巧(一),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

親愛(ài)的讀者,在這篇文章中,我提供了一些c#編程的最佳實(shí)踐。

你是否在用戶(hù)輸入驗(yàn)證中使用異常處理機(jī)制?

如果是,那么你就是那個(gè)把你的項(xiàng)目執(zhí)行速度降低了62倍的人。你不相信我嗎?等幾分鐘;我來(lái)教你怎么做。但是在這個(gè)例子之前,讓我們了解一下在什么地方需要異常處理。

例如,你正在驗(yàn)證用戶(hù)的數(shù)據(jù),對(duì)于任何無(wú)效的輸入,你將引發(fā)一個(gè)異常并將其拋出給客戶(hù)端,如下所示:

class BusinessLogcCheck 
{ 
  public void Check() 
  { 
    try 
    { 
      //Your validation code is here 
    } 
    catch (Exception ex) 
    { 
      throw new Exception("My own exception"); 
    } 
  } 
}

親愛(ài)的朋友,在下一個(gè)示例中,如果你看到輸出屏幕,你將意識(shí)到這種做法有多糟糕。讓我們看看下面的代碼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 
using System.Net; 
using System.Net.NetworkInformation; 
namespace Test1 
{ 
  class Program 
  { 
    public static void ThrowTest() 
    { 
      throw new Exception("This is exceptopn"); 
    } 
    public static Boolean Return() 
    { 
      return false; 
    } 
    static void Main(string[] args) 
    { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      try 
      { 
          ThrowTest(); 
      } 
      catch 
      { 
      } 
      sw.Stop(); 
      Console.WriteLine("With Exception " + sw.ElapsedTicks); 
      sw.Restart(); 
      try 
      { 
        Return(); 
      } 
      catch 
      { 
      } 
      sw.Stop(); 
      Console.WriteLine("With Return " + sw.ElapsedTicks); 
      Console.ReadLine(); 
    } 
  } 
}

這就是你等待的輸出。

我的概念證明非常簡(jiǎn)單。在一個(gè)函數(shù)中,我拋出了一個(gè)異常,在另一個(gè)函數(shù)中,我在檢查用戶(hù)輸入后返回一個(gè)布爾值。我還附上了一個(gè)計(jì)算器的屏幕(哈哈..),讓你相信異常處理是如何影響代碼性能的。

因此,我們可以得出這樣一個(gè)結(jié)論:“不要為用戶(hù)輸入驗(yàn)證引發(fā)異常?!笔褂貌紶柗祷丶夹g(shù)(或類(lèi)似的技術(shù))來(lái)驗(yàn)證業(yè)務(wù)邏輯中的輸入”。因?yàn)楫惓?duì)象的開(kāi)銷(xiāo)非常大。

永遠(yuǎn)不要在循環(huán)中實(shí)現(xiàn)try-Catch

是的,它也與異常處理有關(guān)。我重復(fù)“永遠(yuǎn)不要在循環(huán)中執(zhí)行try-catch”。讓我用一個(gè)例子來(lái)證明。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 
using System.Net; 
using System.Net.NetworkInformation; 
namespace Test1 
{ 
  class Program 
  { 
    static void Method1() 
    { 
      for (int i = 0; i < 1000; i++) 
      { 
        try 
        { 
          int value = i * 100; 
          if (value == -1) 
          { 
            throw new Exception(); 
          } 
        } 
        catch 
        { 
        } 
      } 
    } 
    static void Method2() 
    { 
      try 
      { 
        for (int i = 0; i < 1000; i++) 
        { 
          int value = i * 100; 
          if (value == -1) 
          { 
            throw new Exception(); 
          } 
        } 
      } 
      catch 
      { 
      } 
    } 
    static void Main(string[] args) 
    { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      Method1(); 
      sw.Stop(); 
      Console.WriteLine("Within Loop " + sw.ElapsedTicks); 
      sw.Restart(); 
      Method2(); 
      sw.Stop(); 
      Console.WriteLine("Outside of Loop " + sw.ElapsedTicks); 
      Console.ReadLine(); 
    } 
  } 
}

這是輸出屏幕。

在method1的這個(gè)程序中,我在for循環(huán)中實(shí)現(xiàn)了異常處理機(jī)制,而在method2中,我在沒(méi)有循環(huán)的情況下實(shí)現(xiàn)了異常處理機(jī)制。我們的輸出窗口表明,如果我們?cè)趂or循環(huán)外實(shí)現(xiàn)try-catch程序的執(zhí)行速度將比循環(huán)內(nèi)的try-catch快2倍。

同樣,唯一的結(jié)論是“不要在項(xiàng)目的循環(huán)中實(shí)現(xiàn)try-catch。(是的!不僅在for循環(huán)中,而且在任何循環(huán)中。)

你是否瘋狂到要使用new操作符來(lái)創(chuàng)建一個(gè)整數(shù)變量?

親愛(ài)的讀者,不要因?yàn)槲覍?xiě)了這么長(zhǎng)的標(biāo)題而批評(píng)我,也不要使用new操作符來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的整數(shù)變量。我知道你會(huì)說(shuō),如果你使用new操作符創(chuàng)建一個(gè)簡(jiǎn)單的整數(shù)變量就會(huì)被自動(dòng)設(shè)置為0,不遭受錯(cuò)誤,如“未賦值的局部變量”,但這真的是需要得到一個(gè)自動(dòng)賦值為0,你的目的是創(chuàng)建一個(gè)局部變量來(lái)存儲(chǔ)嗎?讓我們看看new操作符是如何降低代碼執(zhí)行的性能的。 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 
using System.Net; 
using System.Net.NetworkInformation; 
namespace Test1 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      for (int i = 0; i < 1000; i++) 
      { 
        int a = new int(); 
        a = 100; 
      } 
      sw.Stop(); 
      Console.WriteLine("Using New operator:- " + sw.ElapsedTicks); 
      sw.Restart(); 
      for (int i = 0; i < 1000; i++) 
      { 
        int a; 
        a = 100; 
      } 
      sw.Stop(); 
      Console.WriteLine("Without new operator:- "+ sw.ElapsedTicks); 
      Console.ReadLine(); 
    } 
  } 
}

輸出的截圖如下:

new操作符將執(zhí)行速度降低了5倍。我可以否認(rèn)輸出屏幕,但有一件事!!你一次要?jiǎng)?chuàng)建1000個(gè)變量;在我們的項(xiàng)目中,我們不會(huì)一次創(chuàng)建1000個(gè)變量,最多創(chuàng)建2到3個(gè)。

好的。你的應(yīng)用程序是web應(yīng)用程序嗎?如果是,那么請(qǐng)檢查任何流行的web應(yīng)用程序的點(diǎn)擊數(shù),我確信它超過(guò)1000每天。

同樣,這一行的結(jié)論是“不要瘋狂地使用new操作符來(lái)創(chuàng)建整數(shù)變量”。

根據(jù)你的目的選擇最好的集合

我們.net開(kāi)發(fā)人員非常熟悉c#中的集合以及它們用來(lái)存儲(chǔ)值的方法。讓我們看看它們是如何執(zhí)行搜索的。查看搜索整數(shù)的性能。這是我的代碼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 
using System.Net; 
using System.Net.NetworkInformation; 
namespace Test1 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      List<Int32> li = new List<Int32>(1000); 
      Dictionary<int, int> di = new Dictionary<int, int>(1000); 
      int[] arr = new int[1000]; 
      int a; 
      for (int i = 0; i < 1000; i++) 
      { 
        li.Add(i); 
        di.Add(i, i); 
        arr[i] = i; 
      } 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      a = li[500]; 
      sw.Stop(); 
      Console.WriteLine("From list:- " + sw.ElapsedTicks); 
      sw.Start(); 
      a = arr[500]; 
      sw.Stop(); 
      Console.WriteLine("From Integer array:- " + sw.ElapsedTicks); 
      sw.Restart(); 
      a = di[500]; 
      sw.Stop(); 
      Console.WriteLine("From Dictionary:- " + sw.ElapsedTicks); 
      Console.ReadLine(); 
    } 
  } 
}

輸出在這里:

我們可以清楚地看到,在字典的情況下,搜索的性能是最差的,而在list和整數(shù)數(shù)組的情況下,性能非常相似。

方法是好的,但不是所有時(shí)候

如果你還記得你剛開(kāi)始學(xué)習(xí)編程的那幾天,你學(xué)過(guò)一個(gè)概念,就是總是實(shí)現(xiàn)一個(gè)方法來(lái)在代碼中實(shí)現(xiàn)好的練習(xí),是的,實(shí)現(xiàn)一個(gè)方法來(lái)執(zhí)行某些任務(wù)是很好的。方法在編程中有成千上萬(wàn)的優(yōu)點(diǎn),但是讓我們看看方法是如何降低執(zhí)行性能的。我再次強(qiáng)調(diào),這一點(diǎn)并不是反對(duì)方法,而是簡(jiǎn)單地展示方法調(diào)用是一種代價(jià)高昂的機(jī)制,并提供了在何處實(shí)現(xiàn)方法以及在何處不實(shí)現(xiàn)方法的想法。讓我們看看下面的代碼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 
using System.Net; 
using System.Net.NetworkInformation; 
namespace Test1 
{ 
  class test 
  { 
    public static void Print() 
    { 
      Console.WriteLine("I am function from Class"); 
    } 
  } 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      test.Print(); 
      sw.Stop(); 
      Console.WriteLine(sw.ElapsedTicks); 
      sw.Restart(); 
      Console.WriteLine("I am single statement within main"); 
      sw.Stop(); 
      Console.WriteLine(sw.ElapsedTicks); 
      Console.ReadLine(); 
    } 
  } 
}

下面是屏幕輸出:

在這里,我想在輸出窗口中打印一條消息,首先,我在一個(gè)靜態(tài)函數(shù)中實(shí)現(xiàn)了它,并通過(guò)類(lèi)名調(diào)用它,第二次我只是在主函數(shù)中編寫(xiě)它。可以,通過(guò)Console.Writeline()非常簡(jiǎn)單。輸出屏幕顯示單行執(zhí)行比函數(shù)快9倍。因此,唯一的結(jié)論是“在盲目執(zhí)行某個(gè)功能之前,試著了解情況并做出最佳決策”

結(jié)論

謝謝你能容忍我這么長(zhǎng)時(shí)間。我在我的筆記本電腦上做了上面的測(cè)試,我的筆記本電腦有core i3處理器,4GB內(nèi)存和Windows環(huán)境,在程序穩(wěn)定后以釋放模式輸出。如果你使用不同的平臺(tái)和不同的輸出,在評(píng)論部分有足夠的空間寫(xiě)評(píng)論。

以上就是改進(jìn)c# 代碼的五個(gè)技巧(一)的詳細(xì)內(nèi)容,更多關(guān)于改進(jìn)c# 代碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中Attribute特性的用法

    C#中Attribute特性的用法

    這篇文章介紹了C#中Attribute特性的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#使用Directoryinfo類(lèi)獲得目錄信息和屬性的方法

    C#使用Directoryinfo類(lèi)獲得目錄信息和屬性的方法

    這篇文章主要介紹了C#使用Directoryinfo類(lèi)獲得目錄信息和屬性的方法,涉及C#操作目錄的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • c# 如何用lock解決緩存擊穿

    c# 如何用lock解決緩存擊穿

    這篇文章主要介紹了c# 如何用lock解決緩存擊穿,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C# XML字符串包含特殊字符的處理轉(zhuǎn)換方法小結(jié)

    C# XML字符串包含特殊字符的處理轉(zhuǎn)換方法小結(jié)

    今天用C#輸出XML文件時(shí),發(fā)現(xiàn)報(bào)錯(cuò),經(jīng)過(guò)反復(fù)檢查調(diào)試,發(fā)現(xiàn)是因?yàn)槟程巸?nèi)容含有某些特殊字符,這些特殊字符是在XML里不被允許的
    2020-07-07
  • c#中判斷類(lèi)是否繼承于泛型基類(lèi)

    c#中判斷類(lèi)是否繼承于泛型基類(lèi)

    這篇文章主要介紹了c#中判斷類(lèi)是否繼承于泛型基類(lèi),最簡(jiǎn)單的辦法肯定是typeof(b).baseType=typeof(a<string>)這樣就可以返回true,但是這種方法時(shí)不妥的,下面看看如何解決這個(gè)問(wèn)題呢
    2022-04-04
  • C#中l(wèi)ock死鎖實(shí)例教程

    C#中l(wèi)ock死鎖實(shí)例教程

    這篇文章主要介紹了C#中l(wèi)ock死鎖的用法,對(duì)于共享資源的訪(fǎng)問(wèn)及C#程序設(shè)計(jì)的安全性而言,有著非常重要的意義!需要的朋友可以參考下
    2014-08-08
  • C# BeginInvoke實(shí)現(xiàn)異步編程方式

    C# BeginInvoke實(shí)現(xiàn)異步編程方式

    這篇文章主要介紹了C# BeginInvoke實(shí)現(xiàn)異步編程方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C# MVC 微信支付教程系列之掃碼支付代碼實(shí)例

    C# MVC 微信支付教程系列之掃碼支付代碼實(shí)例

    本篇文章主要介紹了C# MVC 微信支付教程系列之掃碼支付,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-12-12
  • C#中的尾遞歸與Continuation詳解

    C#中的尾遞歸與Continuation詳解

    這篇文章主要介紹了C#中的尾遞歸與Continuation詳解,本文講解了遞歸與尾遞歸、尾遞歸與Continuation、Continuation的改進(jìn)等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • 總結(jié)C#刪除字符串?dāng)?shù)組中空字符串的幾種方法

    總結(jié)C#刪除字符串?dāng)?shù)組中空字符串的幾種方法

    C#中要如何才能刪除一個(gè)字符串?dāng)?shù)組中的空字符串呢?下面的文章會(huì)介紹多種方式來(lái)實(shí)現(xiàn)清除數(shù)組中的空字符串,以及在.net中將字符串?dāng)?shù)組中字符串為空的元素去除。
    2016-08-08

最新評(píng)論