用C#編程的建議

来源:http://www.cnblogs.com/shouce/archive/2016/02/22/5206037.html
-Advertisement-
Play Games

1.如果可能儘量使用介面來編程 .NET框架包括類和介面,在編寫程式的時候,你可能知道正在用.NET的哪個類。然而,在這種情況下如果你用.NET支持的介面而不是它的類來編程時,代碼會變得更加穩定、可用性會更高。 請分析下麵的代碼: 1 private void LoadList (object []


1.如果可能儘量使用介面來編程  
    
  .NET框架包括類和介面,在編寫程式的時候,你可能知道正在用.NET的哪個類。然而,在這種情況下如果你用.NET支持的介面而不是它的類來編程時,代碼會變得更加穩定、可用性會更高。

請分析下麵的代碼:  
      

1   private void LoadList (object [] items, ListBox l)  
2   {  
3    for (int i = 0; i < items.Length;i++)  
4     l.Items.Add (items[i].ToString ());  
5   } 

    

  這個函數從一個可為任何對象的數組中載入ListBox,這段代碼被限定為只能使用數組。假想過些時候你發現那些對象存在資料庫中,或別的集合中。那麼你需要修改程式來使用不同的集合類型。如果你用ICollection介面來寫那段程式,你就不用修改那段程式了,對於任何實現ICollection介面的類型它都能很好的工作:  
    

1   private void LoadList (ICollection items,ListBox l)  
2   {  
3     foreach (object o in items)  
4     l.Items.Add (o.ToString ());  
5   }  

    

  ICollection被數組和所有System.Collection中的集合實現。此外,多維數組也支持ICollection介面。如果那還不夠的話,資料庫.NET類同樣支持ICollection介面。用介面寫的這個函數不用需改就可以才許多中情況下使用。  
    

2. 使用屬性代替原始數據  
    
  因為屬性已經成為語言本身的元素,所以聲明數據元素時它的作用域等級沒有必要大於private。因為代碼本身會把屬性看成數據元素,你並沒有失去使用簡單數據類型的便利性 。相反它會使你的代碼更加靈活功能更加強大。屬性使你的數據元素封裝性更好。屬性可以讓你使用lazy evaluation來返回數據。lazy evaluation的意思是當用戶請求時才計算它的值,而不是一直保留著它。  

  最後,屬性可以是virtual也可以是abstract。你也可以在介面中定義屬性。  
    
  這裡還有維護方面的因素應當註意:儘管操作兩者的方法是一樣的,但是你把一個數據元素變成屬性,那麼原先客戶端的程式便不能訪問服務端的新版本程式了。實際上對於在Web service中你想實現序列化的值你可以把它們變成屬性來使用:  
      

複製代碼
 1 private int TheMonth = 0;  
 2     
 3   [XmlAttribute ("Month")]  
 4   public int Month  
 5   {  
 6    get {  
 7     return TheMonth;  
 8    }  
 9    set {  
10     TheMonth = value;  
11    }  
12   } 
複製代碼

 

    
  簡單通過屬性就可以使你的所有數據元素私有化。  
    

3. 在Producer/Consumer 的Idiom中使用Delegate  
    
  當你生成一個實現producer idiom類的時候,使用deletate來通知consumer。這種方法相對於用介面更加靈活。Delegate是多點傳送的,所以不用加額外的代碼你就何以支持多用戶。相對於用介面這樣做可使類之間的耦合性降低。  
    http://www.cnblogs.com/roucheng
  下麵的類處理鍵盤輸入並把它傳給所有的registered listeners:  
    
  public class KeyboardProcessor  
  {  
  private OnGetLine theFunc = null;  
    
  public OnGetLine OnGetLineCallback {  
   get {  
    return theFunc;  
   }  
   set {  
    theFunc = value;  
   }  
  }  
    
  public void Run (){  
  // Read input.  
  // If there is any listeners, publish:  
  string s;  
  do {  
   s = Console.ReadLine ();  
   if (s.Length == 0)  
    break;  
   if (theFunc != null){  
    System.Delegate [] funcs =theFunc.GetInvocationList();  
    foreach (OnGetLine f in funcs) {  
     try {  
      f (s);  
     } catch (Exception e) {  
      Console.WriteLine  
      ("Caught Exception: {0}", e.Message);  
     }  
    }  
   }  
  } while (true);  
  }  
    
  任何數目的listeners都可註冊到producer,它們所要做的只是提供一個特定的函數:deletate。  
    

4. 註意初始化順序  
    
  C#中對於一些變數聲明加入了initializer的概念。它們在構造函數之前被執行,實際上變數在基類的構造函數執行前之前被初始化。  
    
  所以,在初始化變數的時候不要用基類中的數據,因為它們還沒有被構造。 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在跟學弟們聊天的過程中,發現一些人在首次接觸Java時,對環境變數配置總是很生疏。可能是由於初學,對一些概念沒有很深刻的理解。本著助人為樂的精神。我決定幫他們一下。寫一個自動配置JDK環境變數的小工具。 其實,整個過程的邏輯並不難: 1、找到jdk的安裝路徑(預設為C:\Program Files\
  • 今天一位同事咨詢Devexpress TreeList控制項綁定自動顯示父子節點對像,但結果是不會顯示帶父子節點關係,而是將所有的節點作為父節點顯示出來了,對像類的代碼如下 public class Item:XPBaseObject { public Item() : base() { } publ
  • $("#找id的")$(".找樣式的") $("div[id]") 選擇所有含有id屬性的div元素 $("input[name='keleyicom']") 選擇所有的name屬性等於'keleyicom'的input元素 $("input[name!='keleyicom']") 選擇所有的na
  • 萬分感謝Fdyo同學給我們帶來的有中文字幕的系列教程! http://zhuanlan.zhihu.com/MSFaith/20364660 下麵是這系列video教程中的一個截圖作為示例,有代碼,有圖片,有彈幕,還有老外! 什麼是通用 Windows 平臺 (UWP) 應用? 通用 Windows
  • 6年過去了,Angular 迎來了2.0版本.Wijmo5與Angular2已經保持了高度一致.Angular 2 要來了,Wijmo 已準備好迎接
  • 回到目錄 Cannot attach the file as database這個異常是在EF的code frist里經常出現的,解決方法很簡單,只要重新啟動一下V11實例即可。 CMD> sqllocaldb.exe stop v11.0 LocalDB instance "v11.0" stop
  • Visual Studio .net從2003到現在的2008,一路走來慢慢強大……從以前的vs2003能自動改亂你的html代碼到現在在vs2008中都能直接對html代碼進行w3c標準驗證並提示了,非常不易。 論壇中也經常有從事.net開發的新手朋友問一些asp.net開發過程中與web標準之間
  • 故事背景大概是這樣的,我廠兩年前給山西晉城人民政府做了一個門戶網站(地址:http://jccq.cn/),運行了一年多固若金湯,duang的有一天市場部門過來說,新聞管理模塊帶視頻的內容播放不了了。 迅雷不及掩耳,我打開網頁F12一看,因為找不到視頻播放的一個swf文件,仔細一看這個文件竟然引用的
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...