熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#編程的四個技巧(新手必看)

2013-11-13 10:25:40  來源: .NET編程 

  .如果可能盡量使用接口來編程

  NET框架包括類和接口在編寫程序的時候你可能知道正在用NET的哪個類然而在這種情況下如果你用NET支持的接口而不是它的類來編程時代碼會變得更加穩定可用性會更高請分析下面的代碼
    private void LoadList (object [] items ListBox l)
    {
     for (int i = ; i < itemsLength;i++)
      lItemsAdd (items[i]ToString ());
    }這個函數從一個可為任何對象的數組中加載ListBox這段代碼被限定為只能使用數組假想過些時候你發現那些對象存在數據庫中或別的集合中那麼你 需要修改程序來使用不同的集合類型如果你用ICollection接口來寫那段程序你就不用修改那段程序了對於任何實現ICollection接口 的類型它都能很好的工作:

  private void LoadList (ICollection itemsListBox l)
    {
      foreach (object o in items)
      lItemsAdd (oToString ());
    }

  ICollection被數組和所有SystemCollection中的集合實現此外多維數組也支持ICollection接口如果那還不夠的話數據庫NET類同樣支持ICollection接口用接口寫的這個函數不用需改就可以才許多中情況下使用

   使用屬性代替原始數據

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

  最後屬性可以是virtual也可以是abstract你也可以在接口中定義屬性

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

     private int TheMonth = ;

  [XmlAttribute (Month)]
    public int Month
    {
     get {
      return TheMonth;
     }
     set {
      TheMonth = value;
     }
}



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

   在Producer/Consumer 的Idiom中使用Delegate

  當你生成一個實現producer idiom類的時候使用deletate來通知consumer這種方法相對於用接口更加靈活Delegate是多點傳送的所以不用加額外的代碼你就何以支持多用戶相對於用接口這樣做可使類之間的耦合性降低

  下面的類處理鍵盤輸入並把它傳給所有的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 = ConsoleReadLine ();
     if (sLength == )
      break;
     if (theFunc != null){
      SystemDelegate [] funcs =theFuncGetInvocationList();
      foreach (OnGetLine f in funcs) {
       try {
        f (s);
       } catch (Exception e) {
        ConsoleWriteLine
        (Caught Exception: {} eMessage);
       }
      }
     }
    } while (true);
    }


  任何數目的listeners都可注冊到producer它們所要做的只是提供一個特定的函數deletate

   注意初始化順序

  C#中對於一些變量聲明加入了initializer的概念它們在構造函數之前被執行實際上變量在基類的構造函數執行前之前被初始化

  所以在初始化變量的時候不要用基類中的數據因為它們還沒有被構造


From:http://tw.wingwit.com/Article/program/net/201311/13589.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.