返回“設計模式(C#)系列文章索引”介紹將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支援可取消的操作。樣本有一個Message實體類,某個類對它的操作有Insert()和Delete()方法。現在要求可以對之前的所有操作做撤銷和重複。MessageModelusing System;using System.Collections.Generic;using System.Text;namespace
返回“設計模式(C#)系列文章索引”介紹為解除請求的寄件者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它。樣本有一個Message實體類,某個類對它的操作有Insert()方法。現在要求根據插入資訊的字元長度,讓不同的對象去處理,這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它。
返回“設計模式(C#)系列文章索引”介紹為其他對象提供一個代理以控制對這個對象的訪問。樣本有一個Message實體類,某對象對它的操作有Insert()和Get()方法,用一個代理來控制對這個對象的訪問。MessageModelusing System;using System.Collections.Generic;using System.Text;namespace Pattern.Proxy{ /**//// <summary> ///
返回“設計模式(C#)系列文章索引”介紹運用共用技術有效地支援大量細粒度的對象。樣本有一個Message實體類,某些對象對它的操作有Insert()和Get()方法,現在要運用共用支援人員這些對象。MessageModelusing System;using System.Collections.Generic;using System.Text;namespace Pattern.Flyweight{ /**//// <summary> ///
當你建立了一個與反射相關的系統時,你應該為你自己的類型,方法,以及 屬性定義一些自己的特性,這樣可以讓它們更容易的被訪問。自訂的特性標示 了你想讓這些方法在運行時如何被使用。特性可以測試一些目標對象上的屬性。 測試這些屬性可以最小化因為反射時可能而產生的類型錯誤。假設你須 要建立一個機制,用於在運行時的軟體上添加一個菜單條目到一個命令控制代碼上。這個須要很簡單:放一個程式集到目錄裡,然後程式可以自己發現關於它的一些 新菜單條目以及新的功能表命令。這是利用反射可以完成的最好的工作之一:你的
因為兩個原則,把DataSet的名聲搞的不好。首先就是使用XML序列化的 DataSet與其它的非.Net代碼進行互動時不方便。如果在Web服務的API中使用 DataSet時,在與其它沒有使用.Net架構的系統進行互動時會相當困難。其次, 它是一個很一般的容器。你可以通過欺騙.Net架構裡的一些安全類型來錯誤 DataSet。但在現代軟體系統中,DataSet還可以解決很多常規的問題。如果你明 白它的優勢,避免它的缺點,你就可以擴充這個類型了。DataSet類設計
“哪種集合是最好的?”答案是:“視情況而定。” 不同的集合有不同的效能,而且在不同的行為上有不同的最佳化。.Net架構支援很 多類似的集合:鏈表,數組,隊列,棧,以及其它的一些集合。C#支援多維的數 組,它的效能與一維的數組和鋸齒數組都有所不同。.Net架構同樣包含了很多特 殊的集合,在你建立你自己的集合類之前,請仔細參閱這些集合。你可以發現很 多集合很快,因為所有的集合都實現了ICollection介面。在說明文檔中列出了
使用者的輸入可能是多種多樣的:你必須在互動控制項中儘可能的驗證輸入 。寫一些使用者輸入驗證可能很做作,而且也有出錯的可能,但還是很有必要的。 不能太相信使用者的輸入,使用者可能會輸入任何內容導致異常發生,進而進行SQL 注入式攻擊。我們不希望任何類似這樣的事情發生。你應該瞭解足夠的資訊來懷 疑使用者的輸入。很好,每個人都應該這樣做,這也就是為什麼.Net架構已經擴充 了這樣的功能,你可以使用這些功能從而使自己的代碼編寫工作減到最小,因為
有經驗的Windows程式員一定對寫代碼從一個控制項上取值,以及把值儲存到控 件上很熟悉:public Form1 : Form{ private MyType myDataValue; private TextBox textBoxName; private void InitializeComponent( ) { textBoxName.Text = myDataValue.Name; this.textBoxName.Leave += new
我們要尋求一種避免直接寫代碼的應用程式配置和資訊設定方法,我們已經 建立了多種不同的策略來儲存配置資訊。而我們是要尋求一種正確的方法,我們 要不斷提高和改我們的想法,關於哪裡是放置這些資訊的好地方。INI檔案?這 是Windows3.1做的事,配置資訊的結構是受限制的,而且在檔案名稱上可能還會與 其它程式程式相衝突。註冊表?是的,是這個正確的想法,但它也有它的限制。 亂七八糟的程式可能會通過在註冊表裡寫一些錯誤資訊來嚴重破壞電腦。正因
當有問題發生時,它們往往並不是在實驗的時候發生的,機器有輕鬆調試的 工具。在很多實際情況中,你不好修正的問題總是發生在使用者的機器上,那裡沒 有調試環境,也沒有好的方法計算出問題的情況。在實際情況中,有經驗的開發 人員會建立一個方法,讓系統在運行時捕獲儘可能多的資訊。.Net架構已經包含 一些類集合,利用這些集合,你可以做一些通用的調試。而且這些類可以在運行 時或者編譯時間進行配置。如果你利用它們,你就可以輕鬆的發現在實際運行時的
很多.Net類提供了兩種不同的方法來控制一些系統的事件。那就是,要麼添 加一個事件控制代碼;要麼重寫基類的虛函數。為什麼要提供兩個方法來完成同樣的 事情呢?其實很簡單,那就是因為不同的情況下要調用為的方法。在衍生類別的內 部,你應該總是重寫虛函數。而對於你的使用者,則應該限制他們只使用控制代碼來響 應一些不相關的對象上的事件。例如你很了一個很不錯的Windows應用程 序,它要響應滑鼠點下的事件。在你的表單類中,你可以選擇重寫OnMouseDown ()方法:public class
我的同事,也是我的朋友Martin Shoemaker研究一個很嚴肅的問題,那就是 :“我必須寫這樣的.Net代碼嗎?” 答案是,也希望是:不。你應 該使用你手頭上有的,也是你會用的工具來協助你寫代碼。.Net架構是 一個很豐富的類庫,你對架構學習的越多,你自己要寫的代碼就越少。架構庫會 幫你完成很多工作。這一章就告訴你一些.Net架構裡最常用的一些技術。當你在 .Net架構中有多個選擇時,這一章中的一些原則會協助你選擇最好的。你可以使
並不是所有的人都須要知道所有的事。也不是所有的類型須要是公用的。對於每個類型,在滿足功能的情況下,應該儘可能的限制存取層級。而且這些存取層級往往比你想像的要少得多。在一個私人類型上,所有的使用者都可以通過一個公用的介面來訪問這個介面所定義的功能。讓我們回到最根本的情況上來:強大的工具和懶惰的開發人員。VS.net對於他們來說是一個偉大的高產工具。我用VS.net或者C# Builder輕鬆的開發我所有的項目,因為它讓我更快的完成任務。其中一個加強的高產工具就是讓你只用點兩下按鈕,一個類就建立了,
這一原則實際應該取這個名字:“應該建立大小合理而且包含少量公用 類型的程式集”。但這太沉長了,所以就以我認為最常見的錯誤來命名: 開發人員總是把所有的東西,除了廚房裡水溝以外(譯註:誇張說法,kitchen sink可能是個口語詞,沒能查到是什麼意思,所以就直譯了。),都放到一個程 序集。這不利於重用其中的組件,也不利於系統中小部份的更新。很多以二進位 組件形式存在的小程式集可以讓這些都變得簡單。然而這個標題對於程
做為一個有經驗的程式員,不管你在使用C#以前是習慣用什麼語言的,我們 綜合了幾個可以讓你開發出有效代碼的實際方法。有些時候,我們在先前的環境 中所做的努力在.Net環境中卻成了相反的。特別是在你試圖手動去最佳化一些代碼 時尤其突出。你的這些行為往往會阻止JIT編譯器進行最有效最佳化。你的以性 能為由的額外工作,實際上產生了更慢的代碼。你最好還是以你最清楚的方法寫 代碼,其它的讓JIT編譯器來做。最常見的一個例子就是預先最佳化,你建立一個
.Net運行環境是語言無關的:開發人員可以用不同的.Net語言編寫組件。而且在實際開發中往往就是這樣的。你建立的程式集必須是與公用語言系統(CLS)是相容的,這樣才能保證其它的開發人員可以用其它的語言來使用你的組件。CLS的相容至少在公用命名上要與互用性靠近。CLS規範是一個所有語言都必須支援的最小操作子集。建立一個CLS相容的程式集,就是說你建立的程式集的公用介面必須受CLS規範的限制。這樣其它任何滿足CLS規範的語言都可以使用這個組件。然而,這並不是說你的整個程式都要與CLS的C#語言子集相
隨著類的數量增加,建立二進位的組件就變得很平常了:你想分離部分功能 。所有不同的是,二進位組件可以讓你獨立的儲存這些離散的功能。建立的組件 程式集可以方便的共用邏輯,方便交叉語言 編程,以及方便布置。在.Net程式就是組件包,每一個程式什麼樣可以隨時更新和發布。你應該已經知 道,基於程式集之間的應用程式是多麼容易更新呀,程式集之間的偶合是多麼好 呀! 最小偶合就是說更多的是減少了程式集之間複雜的依懶關係。同時也意味著 你可以簡單的更新小塊新 的程式集。這一章就是關於建立簡單易用,容易布置
本文是對C#網路版鬥地主的開發總結,同時也是最後一篇。大家知道,鬥地主這個遊戲是將一些特有的牌組合成牌組然後來比較牌組的大小,那麼,就應該給PokerGroup類定義一個屬性type,即牌組的類型,type的值是一個枚舉類型1 public enum PokerGroupType2 {3 單張 = 1,4 對子 = 2,5 雙王 = 3,6 三張相同 = 4,7 三帶一 = 5,8 炸彈 = 6,9 五張順子 = 7,10 六張順子 = 8,11 三連對 = 9,12 四帶二
本文是對C#網路版鬥地主的總結。首先伺服器使用一個隨機數來隨即選出預設地主。然後發送資訊給選出來的玩家。玩家接收到資訊後顯示兩個按鈕“叫地主”,“不叫”。如果選擇不叫,則把可以叫地主的許可權發送給另外一個玩家,如果另外兩個玩家都不要的話,就執行Restart()方法重新發牌。叫地主許可權的行程順序如下圖所示:具體實現方法:伺服器得到一個1-3的隨機數,1代表格服務器是預設地主(預設地主就是隨機播放的第一個有許可權叫地主的玩家),2代表client1