国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C#幾個經常犯錯誤匯總

開發 后端
在我們平常編程中,時間久了有時候會形成一種習慣性的思維方式,形成固有的編程風格,但是有些地方是需要斟酌的,即使是一個很小的錯誤也可能會導致昂貴的代價,要學會善于總結,從錯誤中汲取教訓,盡量不再犯同樣錯誤,注重編程之美,代碼的優雅,總結幾個平常經常犯的錯誤。

在我們平常編程中,時間久了有時候會形成一種習慣性的思維方式,形成固有的編程風格,但是有些地方是需要斟酌的,即使是一個很小的錯誤也可能會導致昂貴的代價,要學會善于總結,從錯誤中汲取教訓,盡量不再犯同樣錯誤,注重編程之美,代碼的優雅,總結幾個平常經常犯的錯誤。

1、在C#編程中,字符型類型是最容易處理出錯的地方,代價是非常昂貴,在.Net Framwork中,字符串是一個相當特別的引用類型,string本省就是一個不可繼承的密封類,但是它具有了值類型所應用的特點,但是它在CLR中內存還是保存于托管堆之上,也就是說,當我們每次定義一個字符串類型的時候,就在堆內存中開辟一端內存,而當我們字符串被修改之后,它會創建一個新的內存,注意這里的內存是不連續的,而是通過修改棧內地址引用而拼湊字符串,不會改變源字符串在內存中的地址,所以有些程序員總是喜歡使用這樣的方法格式化字符串:

  1. string  SelectText="select * from "+TableName+" where UserName='"+Name+"'"

上述代碼,使用了字符串拼湊的方法,因為使用了多重串聯,因此會在內存中創建兩個不必要的字符串垃圾副本。

其實在C#中,已經為我們提供了StringBuilder和String.Fromat來解決此問題,雖然他們可以實現同樣的功能,但是他們有質的變化,StringBuilder在內存中開辟的是一段連續內存,當增加新字符串時候,它會在棧中指向的同一個堆內存中連續存放字符,這就形成了性能的提升。所以我們將上面代碼改成:

  1. string SelectText=string.Format("select  *  from {0} where UserName={1}",TableName,Name); 

2、大多數開發人員都不知道內置的驗證數據類型的方法,如System.Int32,因此很多人都是自己實現的,其實這是不妥的,因為這些基本類型中都存在自己固有的類型驗證方法,下面這個就是自己實現驗證的一個字符串是否是數值的代碼:

  1. public bool CheckIfNumeric(string value)  
  2. {  
  3.     bool IsNumeric=true;  
  4.     try 
  5.      {  
  6.            int i=Convert.ToInt32(value);  
  7.      }  
  8.      catch(FormatException excepiton)  
  9.      {  
  10.            IsNumeric=false;  
  11.      }  
  12.      return IsNumeric;  

雖然使用了try catch語句,這不是最佳的做法,更好的方法是下面使用Int.TryParse;

  1. int output=0;  
  2. bool IsNumeric=int.TryParse(value,out output); 

int.TryParse是更快、更簡潔的方法。

3、自己利用IDisposable接口手動釋放內存

在.NET Framework中,對象的處理和使用一樣重要,理想的方法是在使用完對象的時候,在類中實現IDisposable接口中的dispose方法進行內存的釋放,當然在.Net本身提供的垃圾回收機制(GC)中就提供了這樣的功能,在我們實例化類對象時,在類本身的析構函數中會調用dispose方法,GC在各級內存堆滿的情況下,自動檢查對象使用情況,去相應的釋放內存,但是運行在非托管平臺上的方法,需要我們自己手動釋放內存,比如我們常見的SqlConnection對象,也就有了下面的創建、使用和處理方法:

  1. public void  DALOneMethod()  
  2. {  
  3.     SqlConnection  connection=null;  
  4.     try 
  5.      {  
  6.           connection =new SqlConnection("。。。。。。。。。。。");  
  7.           connection.Open();  
  8.           //sqlcommand。。run  
  9.  
  10.      }  
  11.      catch(Exception exception)  
  12.      {  
  13.              // manager exception  
  14.      }  
  15.      finally 
  16.      {  
  17.             connection.Close();  
  18.             connection.Disopse();  
  19.      }  

上述代碼是大部分程序員會出現的代碼,乍看沒啥問題,連接處理在最后一個代碼中被明確調用,但是如果發生了一個異常,catch代碼塊就被執行,然后再執行最后一個代碼塊處理連接,因此在最后一個代碼塊執行之前,連接將一直留在內存中,大部分我們會在此處記錄錯誤,一般涉及到IO操作,如果延時時間比較長的話,這個連接將在內存時間長時間停留。我們一個原則就是當對象不再使用的時候我們里面釋放資源。

我們采用程序邏輯域來處理這個問題會更好:

  1. public void  DALOneMethod()  
  2. {  
  3.     using(SqlConnction  connection=new SqlConnection("。。。。。。。"))  
  4.      {  
  5.          connction.Open();  
  6.       // do SUAD  
  7.      }  

當使用using代碼快時,對象上的dispose()方法將在執行推出邏輯域的時候調用,這樣就保證了SqlConnection的資源處理被盡早釋放,當然這個方法也適用于實現IDisposable接口的類,當時個人不推薦這樣做,在非常有把握的情況下可以手動釋放,但是沒把握還是叫給.net系統釋放,因為本身類的析構函數就實現這個方法,當我們自己重寫后,反而會導致系統誤以為你自己定義了方法,而推遲釋放資源,有興趣可以研究下GC運行本質,假如能在第一代被釋放的內存,如果我們重寫dispose方法反而推遲到第二代內存堆中釋放,顯然是不可取的。

4、學會合理的管理公共變量,我們在系統中經常會濫用公共變量,沒有做到合適的封裝好。

  1. static  void Main(string[]  args)  
  2. {  
  3.             MyAccount  account=new MyAccount();  
  4.            //這地方不能隨便的調用account里面的字段進行更改,但是缺改了  
  5.         account.AccountNumber="ddddddddd";  
  6.            Console.ReadKey();  
  7. }  
  8. public class MyAccount  
  9. {  
  10.           public  string AccountNumber;  
  11.           public  MyAcctount()  
  12.           {  
  13.                 AccountNumber="ssssssssssssss";  
  14.           }  

在上面的MyAccount類中生命了一個AccountNumber公共變量,理想情況下,AccountNumber應該是只讀的,不能讓外界修改,但是這里MyAccount類卻沒有對它做任何控制。

聲明公共做法應該是使用屬性,如:

  1. public  class  MyAccount  
  2. {  
  3.    private stirng _accountNumber;  
  4.    public  string AccountNumber  
  5.    {  
  6.         get {  return  _accountNumber;  }  
  7.    }  
  8.    public  MyAccount()  
  9.    {  
  10.           _accountNumber="dddddddd";  
  11.    }  

這里我們封裝了AccountNumber公共變量,它變成了只讀,不能由調用者類進行修改。

5、嵌套的異常處理,有的開發人員喜歡在方法末尾加上處理的嵌套方法,如

  1. public class NestedExceptionHandling  
  2.   {  
  3.       public void MainMethod()  
  4.       {  
  5.           try 
  6.           {  
  7.               //some implementation  
  8.               ChildMethod1();  
  9.           }  
  10.           catch (Exception exception)  
  11.           {  
  12.               //Handle exception  
  13.           }  
  14.       }  
  15.     
  16.       private void ChildMethod1()  
  17.       {  
  18.           try 
  19.           {  
  20.               //some implementation  
  21.               ChildMethod2();  
  22.           }  
  23.           catch (Exception exception)  
  24.           {  
  25.               //Handle exception  
  26.            throw;  
  27.     
  28.           }  
  29.       }  
  30.     
  31.       private void ChildMethod2()  
  32.       {  
  33.           try 
  34.           {  
  35.               //some implementation  
  36.           }  
  37.           catch (Exception exception)  
  38.           {  
  39.               //Handle exception  
  40.               throw;  
  41.           }  
  42.       }  
  43.   } 

如果相同的異常被處理多次,性能開銷將會增加。

我們的解決方法是讓異常處理方法獨立開來,如:

  1. public class NestedExceptionHandling  
  2.   {  
  3.       public void MainMethod()  
  4.       {  
  5.           try 
  6.           {  
  7.               //some implementation  
  8.               ChildMethod1();  
  9.           }  
  10.           catch(Exception exception)  
  11.           {  
  12.               //Handle exception  
  13.           }  
  14.       }  
  15.     
  16.       private void ChildMethod1()  
  17.       {  
  18.           //some implementation  
  19.           ChildMethod2();  
  20.       }  
  21.     
  22.       private void ChildMethod2()  
  23.       {  
  24.           //some implementation  
  25.       }  
  26.   } 

6、大數據量上使用Dataset和DataReader混用,當單表數據量很大的情況,使用DataSet是一種很不明智的選擇,應為DataSet是以DataTable內存形式存放數據量,一次性將數據拖入內存,當數據很大的情況下,這種方式是很吃內存的,相比DataSer,DataReader就顯得優雅很多,它是每次讀取一條數據,然后輪詢調用機制,但是也有它的弊端,就是相對長連接,但是對內存消耗而言這是有利的,當然DataSet在大部分應用場景下也是有自己的優點,充分解耦、一次性操作、領域模型操作等方面,兩者分情況分場景而用,這里只是稍微提提,根據場景分析區別。

原文鏈接:http://www.cnblogs.com/zhijianliutang/archive/2012/03/20/2407688.html

【編輯推薦】

  1. 淺談面向對象程序設計C#中的類
  2. 詳解C#中不同類的類型
  3. 淺談C#中標準Dispose模式的實現
  4. C#選擇正確的集合進行編碼
  5. C# 4.0新特性:協變與逆變中的編程思想
責任編輯:林師授 來源: 指尖流淌的博客
相關推薦

2010-09-02 08:44:12

CSS

2010-09-13 14:50:26

DIV+CSS

2013-07-08 15:45:04

Python

2024-04-01 07:10:00

內存泄漏C++編程

2021-05-27 09:50:10

工程師代碼技術

2025-12-09 06:00:00

2011-01-04 13:45:55

系統管理員

2019-12-20 09:29:25

Linux數據庫軟件

2019-08-06 13:00:29

編程編程禁忌程序員

2023-11-18 18:39:36

2013-06-28 10:41:07

產品經理

2009-07-31 09:01:12

AdRotator控件

2015-02-05 14:47:47

Android失敗功能

2014-05-13 13:09:23

Python程序員

2022-09-14 13:35:41

企業數據團隊

2011-03-16 09:38:05

2023-03-21 15:12:55

2015-04-30 09:07:15

2020-08-26 08:54:17

CSSFont Size屬性

2017-09-04 08:49:37

編程互聯網持續交付
點贊
收藏

51CTO技術棧公眾號

久久精品一区二区三区不卡 | 麻豆国产一区| 亚洲啪啪综合av一区二区三区| 日本黑人久久| baoyu135国产精品免费| 亚洲国产91精品在线观看| 最新精品视频在线| 国产无人区一区二区三区| 日本黑人久久| 欧美精品观看| 国产精品免费久久久久久| 99久热在线精品视频观看| 精品美女被调教视频大全网站| 女同互忝互慰dv毛片观看| www.66久久| gogogo免费高清日本写真| 在线观看视频免费一区二区三区| 国产91精品最新在线播放| 国产日本亚洲| 中文字幕亚洲无线码在线一区| 怡红院在线播放| 欧美视频三区在线播放| 色婷婷综合缴情免费观看| 国产精品美女久久久久久久| 国产免费黄色av| 国产大陆a不卡| 黄色免费高清视频| 久久66热re国产| 一区二区三区偷拍| 免费看欧美女人艹b| 日韩精品一区二区三区外面| 国产综合精品| 亚洲一区二区三区四区在线播放 | 久久久久久久亚洲精品| 美女色狠狠久久| 精品欧美乱码久久久久久1区2区| 成人h小游戏| 色婷婷久久综合| 美国成人毛片| 欧美午夜片在线免费观看| 午夜男人视频在线观看| 亚洲午夜精品网| 四虎永久在线| 欧美香蕉大胸在线视频观看| 四虎精品成人免费网站| 日韩欧美在线视频日韩欧美在线视频| 麻豆影视在线观看| 欧美日韩国产精品一区| 中文字幕123| 欧美日韩激情小视频| 在线中文字幕观看| 欧美性猛交xxxx富婆| 欧美美女色图| 欧美日产在线观看| av有码在线观看| 国产亚洲综合久久| 97视频一区| 国产精品欧美激情| 亚洲性感美女99在线| 日韩成人在线资源| 成人动漫在线一区| 蜜臀av免费观看| 亚洲午夜三级在线| av网站在线播放| 日韩精品极品视频| 午夜久久av| 91免费版网站入口| 日日夜夜精品视频天天综合网| 国产手机视频在线观看| 久久婷婷久久一区二区三区| 国产特级毛片| 欧美日韩在线三级| 欧美不卡高清一区二区三区| 97色伦亚洲国产| 欧美视频官网| 男人日女人的bb| 国产精品二区一区二区aⅴ污介绍| 在线观看午夜看亚太视频| 日韩一级在线观看| 日韩成人在线一区| 欧洲永久精品大片ww免费漫画| 亚洲深深色噜噜狠狠爱网站| 欧美污视频久久久| 成人的网站免费观看| 狠狠干在线视频| 精品免费视频.| 精品久久ai电影| 久久一区二区精品| 久久久精品国产免费观看同学| fc2人成共享视频在线观看| 精品欧美久久久| 卡通动漫国产精品| 欧美人与性禽动交精品| 国产亚洲精品7777| 在线观看免费版| 欧美激情手机在线视频| 亚洲成人资源| 成人性生生活性生交12| 欧美狂野另类xxxxoooo| 日韩电影精品| 国产精品久久久久久免费观看 | 国产精品美女在线观看| 男人的j进女人的j一区| 97影院理论片在线播放| 777欧美精品| 日本成人a网站| 成人手机视频在线| 狠狠躁夜夜躁人人爽天天天天97| 99久久精品一区二区成人| 国产 日韩 欧美大片| 欧美不卡一区二区| 精品国产一区二区三区成人影院| 欧美大香线蕉线伊人久久| 国产精品久久久久一区二区三区| av大全在线| 成人写真视频福利网| 欧美激情一区不卡| 韩国成人漫画| 精品一区二区日本| 亚洲国产精品久久久久秋霞影院| 日韩国产大片| 一区二区三区四区五区视频| 色婷婷久久一区二区三区麻豆| 成人中文字幕视频| 男人添女荫道口图片| 91精品国产色综合久久久蜜香臀| 欧美熟乱15p| www浪潮av99com| 久久这里只有精品99| 精品中文av资源站在线观看| 你懂的在线播放| 国产精品99久久久久久www| 91亚洲精华国产精华精华液| 欧洲精品二区| 久久99影院| 欧美亚洲尤物久久| 亚洲乱码精品| 黄污在线观看| 欧美激情精品久久久久久免费印度| 国产在线精品免费av| 中文字幕资源网在线观看| 国产精品.com| 欧美日韩午夜剧场| 欧美亚洲在线日韩| 又黄又爽毛片免费观看| 久久久精品影院| 成人精品一区二区三区四区| 成av人片在线观看www| 日本福利一区二区三区| 在线播放视频一区| 99riav国产精品| 免费av在线网址| 欧美 日韩 国产在线| 欧美日韩成人综合天天影院| 欧美影院一区| 韩国中文字幕2020精品| 亚洲在线第一页| 在线观看免费视频综合| 欧美午夜国产| 麻豆网在线观看| 免费国产一区二区| 911精品国产一区二区在线| 免费日韩av片| 欧美78videosex性欧美| 中文字幕一区二区三区四区五区 | 国产精品videossex| 免费裸体美女网站| 美女少妇精品视频| 久久久国产一区二区三区四区小说| 高清国产一区二区三区四区五区| 日本www在线播放| 国a精品视频大全| 亚洲黄色小说网站| 国产精品久久占久久| 精品影院一区| 欧美日韩在线精品| 精品伊人久久97| 2023国产精品自拍| 在线播放一区二区精品视频| 国产主播福利| 91在线短视频| 精品久久久三级丝袜| 成人免费视频网站在线观看| 亚洲国产aⅴ精品一区二区| 看黄的a网站| 久久影院理伦片| 尤物tv国产一区| 亚洲视频精选在线| 欧美黄色一区| av中文字幕在线看| 精品www久久久久奶水| 国产精品免费一区| 欧美一区二区二区| 91老师片黄在线观看| 禁断一区二区三区在线| 嫩草在线视频| 欧美色图色综合| 亚洲一区二区三区四区视频| 日韩精品中文字幕久久臀| 久久久亚洲精品一区二区三区|