精彩推薦:.Net編程的十個技巧

來源:互聯網
上載者:User
編程|技巧 .NET編程的10點技巧
--------------------------------------------------------------------------------

不管你是對Windows Forms, ASP .NET, Web Services感興趣, 還是對 .NET Framework感興趣,這些技巧協助你探索新的.NET技術。
By Dino Esposito


.NET Framework比以前更大了,包含了大量的類和方法,但是開發團體還沒有探索和理解大多數的難以置信的軟體特性,這些特性開始的時候也許是個bug或者設計缺陷,第二次出現的時候也許就被認為是一個重大的改進,包涵了更多的思考。

按照這不可避免的再最佳化過程,和其他開發人員共用技巧是一個能夠讓你在建立你的第一個.NET應用程式時把握正確方法的途徑,儘管它遠遠不能夠提供你正在尋找的明確的解決方案。我總結了能夠使你的.NET開發效率更高的十個技巧。為了能儘可能多的協助開發人員,這些技巧覆蓋了這項技術的整個範圍,從ADO.NET到ASP.NET,從CLR到Framework,從Windows Forms到Web Services。這些技巧,再加上我可以預期的,將會對開發人員產生很大的影響。


#1建立你的DataGrid的頁尾

DataGrid控制項的頁尾起著很重要的作用—也就是說,頁尾能總結頁面裡的部分內容。除非你設定ShowFooter成True, 否則頁尾是看不見的。一旦你設定了,頁尾就會出現,但是它和其它行有同樣數目的列。如果你覺得這個可以,那就沒有問題。否則,你就需要給頁尾增加欄位或者去掉現有的欄位。

OnItemCreated是關鍵的呼叫事件。它是事件處理常式的開始: ListItemType itemType = _e.Item.ItemType;
if (itemType == ListItemType.Footer)
  {
     e.Item.Cells.RemoveAt(1);
     e.Item.Cells.RemoveAt(1);
     cellSummary.ColumnSpan = 3;
     e.Item.Cells[0].Text = "…";
   }



確保頁尾建立時你能夠幹涉,然後取得在頁尾行顯示的執行個體。這樣你就可以隨意增加和減少單元了。別忘了把ColumnSpan屬性設定成為列的初始值,以避免顯示的問題,比如,頁尾線比其它格子長或者短了。


#2 使用 Cache 對象而不使用 Application對象

在ASP中,你使用Application對象來發現全域事件和儲存全域範圍的資料。假設許多不同的使用者可以訪問同一個資料,你必須使用Lock 和Unlock方法來實現連續訪問和避免存取違規或者其它不可預測的結果。在ASP.NET中,和Application對象一起的,還有Cache對象,它和Application有相同的特徵,但最終可以在不止一個場合來做Application的替代品。

Cache對象和Application對象都是集合資料容器,其內容能跨越頁面和Session領域。他們都不支援Web farm和Web garden情況。Web farm是多個伺服器運行一個應用程式的網路伺服器結構。Web garden是同一個伺服器上的多個進程運行一個程式。

和Application不同的是,Cache對象在應用程式的第一次調入時並沒有執行個體化。僅當你使用它時它才會被建立。另外,Cache對象還可以儘可能地減小其資料項目佔有的記憶體空間。你可以給Cache設定相對的或絕對的有效期間,也可以設定優先權和衰變因子。然後,你就對你的全域資料狀態有了更大的控制能力,也能夠執行在低記憶體狀況下適度降級的特別方案。還有,就是,Cache對象是安全執行緒的,不需要加鎖和解鎖。


#3 用GET或POST調用服務

網路服務從根本上來說是一個你通過HTTP來串連的一個網址(URL)。當你為給定的網路服務建立了一個代理類,除非有其他方面的說明,命令列工具wsdl.exe給你提供了一個類,這個類使用SOAP協議使得可以遠程調用網路服務。

儘管SOAP協議被認為是調用遠程程式的標準,但是沒有什麼可以阻止你使用簡單的GET或者POST方法來調用.NET網路服務。順便說一下,POST命令傳遞SOAP有效負荷。

你可以在代理類中直接建立這個特徵,只要當調用wsdl.exe 裝置時,你轉換協議為httpget或者httppost就可以了。封包類的原始碼相應的調整。你也可以使用XmlHttpRequest對象和簡單的指令碼或者編譯的代碼來調用網路服務(更多資訊,見資源): Set http = _CreateObject("Microsoft.XMLHTTP")
  http.open "GET", "http://server/service.asmx/MethodName", false
  http.send ""
  MsgBox http.responseText



通過使用XmlHttpRequest,你可以通過Win32,指令碼,總的來說,非.NET代碼來串連網路服務。

#4 使用Cookieless Sessions

在ASP.NET中,Session對象參考一個軟體配置實體,在那裡你可以設定成進程中或者進程外模式。Session對象讀取許多運行時設定,這些設定你可以存在Web server的framework的安裝目錄,或者存在從web.config檔案得來的應用程式的BIN目錄。web.config檔案來決定許多ASP.NET組件的設定。如果你放config.web的拷貝在你的應用程式的當地子目錄下,這個設定覆蓋掉在framework目錄中的預設設定。

你要配置的是Session管理器是否能夠識別用戶端使用cookies的 Session. 在應用程式的config.web檔案中設定下面一行使Session管理器能夠在不使用Cookie的情況下工作。 <sessionState cookieless="true" />




#5 使用定製的Grid分頁

Web Form的DataGrid控制項有內建的支援分頁。它自動顯示一個分頁條,幾乎不用寫多少代碼,就可以顯示給定記錄大小的頁面。然而,預設的,所有必須的記錄隱藏在DataGrid對象的DataSource屬性中。這就意味 著你必須一次取回所有的資料。儘管當記錄很少時這不是什麼問題,但是當有成千上萬條記錄時,這就變成了一個問題。在這種情況下,你就必須手工取回記錄,把他們存在磁碟裡,而不是資料庫管理系統。

你必須通知DataGrid這個特殊的行為。幸運的是,DataGrid提供了一個AllowCustomPagination屬性,當這個屬性設定成為True時,就會大大改變這個控制項的內建行為。這時,grid總是從頭到尾讀取從DataSource屬性中找到的記錄。你應該用屬於當前頁的資料來補充這個容器。一般情況下,grid自己只取屬於這頁的從DataSource屬性中取到的記錄。


#6 從資料庫中裝入關鍵字資訊

DataTable對象讓你設定特定表的記憶體中的主鍵。這個行為加快了在DataTable和相關的DataView對象之間的搜尋。另外一個好處就是阻止重複錄入,它幹擾表的完整性。這樣,你在資料提交到資料庫做一個批處理更新之前就有足夠的時間來修正表,甚至向使用者提供適當的警告。

你可以在批處理代碼中手工設定這些資訊: // ds is an existing dataset
DataColumn[] keys = new DataColumn[1];
DataTable dt = ds.Tables["MyTable"];
keys[0] = dt.Columns["ID"];
dt.PrimaryKey = keys;



你可以在填充資料集時自動化佈建和檢測主鍵資訊。它是這樣實現的:你設定資料配接器的MissingSchemaAction屬性執行下面的查詢代碼來自動診測資訊。 SqlDataAdapter da = new SqlDataAdapter(strCmd, strConn);
DataSet ds = new DataSet();
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da.Fill(ds, "MyTable");




#7 需要選擇的Checkboxes

在ASP中,你有幾個Checkboxes,都有相同的名字: <input type="checkbox" name="foo" value="…">



你可以得到Checkbox的相應的值從下面的行代碼: <% a = split(Request.Form("foo"), ",")  %>



Request.Form("foo")返回一個用逗號隔離的字串,這個字串是所有選擇項的串值形成的。你把這個字串交給一個VBScript的分離函數,就得到一個易於管理的結構,比如數組。

同樣的代碼在ASP.NET中將沒有辦法運行。如果你使用<asp:checkbox>服務端控制項。為了使它工作,使用HtmlInputCheckBox控制項,寫代碼如下: <type="checkbox" runat="server" name="foo" value="…">



即使asp:checkbox和input type="checkbox"服務端標籤等價於同樣的HTML代碼,ASP.NET確保輸出asp:checkbox和<asp>名字空間中的其它控制項的標籤的唯一的ID和名字。

#8 自動主表/詳細表瀏覽

如果你在Windows Forms應用程式中用DataGrid控制項來顯示主表/詳細表。其變化在於framework為你自動同步展示。

關鍵在於在兩個表之間建立資料關聯和用來定義詳細表的資料來源的組合運算式。我們假設你有兩個表:Customers 和 Orders,其中都有CustID欄位。你按照ADO .NET DataRelation對象建立一個關聯: // ds is an existing DataSet
Dim dc1, dc2 As DataColumn
dc1 = ds.Tables("Customers").Columns("custid")
dc2 = ds.Tables("Orders").Columns("custid")
Dim r As DataRelation
r = New DataRelation("OrdersByCustomer", dc1, dc2)
ds.Relations.Add(r)



不論何時你用DataRow對象表示主表(Customers)中的一行,在這種情況下,你可以根據關聯,使用DataRow 的 GetChildRows方法得到子表的資料。就Windows Forms而言,這個編程過程中使用下面的代碼: dGrid.DataSource = ds
dGrid.DataMember = "Customers.OrdersByCustomer"



當你用運算式比如MasterTable.Relation串連詳細子表,其內容就會自動地正確地更新。


#9 用類實現檔案變更通知

.NET把 Win32檔案通知類功能整合到FileSystemWatcher類上來。這些核心類主要負責當檢測到系統檔案層發生改變時通知用戶端應用程式。按照特定的參數,當檔案建立、修改、重新命名或者刪除時,通知對象發訊號描述應用程式狀態。

對於Win32程式來說,瞭解Windows NT 和indows 2000下有關檔案的名稱和有關事件的起因是困難的。所有這些在 .NET中被FileSystemWatcher類取代了。 FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "c:\\";
watcher.Filter = "*.txt";
watcher.NotifyFilter = NotifyFilters.LastWrite;



一旦對象被配置後,你開始檢測: watcher.EnableRaisingEvents = true;



任何偵測到的事件啟用了應用程式事件。你可以象如下記錄事件: watcher.Changed += new FileSystemEventHandler(OnChanged);



事件處理常式參數提供你所需要的所有的檔案和資訊。


#10 編譯代碼

.NET Framework提供類,這些類可以讓你用指定的語言編譯代碼。它們封包在System.CodeDom.Compiler名字空間裡。下面代碼片斷顯示了如何得到運行在記憶體中的C#編譯器的執行個體: CSharpCodeProvider csc = new CSharpCodeProvider();
ICodeCompiler icc = csc.CreateCompiler();



接著,你將設定CompilerParameters類的一些輸入參數: CompilerParameters co = new CompilerParameters();
co.OutputAssembly = "foo.exe";
co.ReferencedAssemblies.Add("system.dll");



你必須至少指明可執行檔名稱,設定GenerateExecutable為False如果你想要一個DLL, 並且增加集合列表供參考: icc.CompileAssemblyFromFile(co,csfile);

為了運行編譯過程,使用CompileAssemblyFromFile(),傳遞給它參數和源檔案名稱。你可以使用類CompilerResults以瞭解最新產生的集合的更多資訊。

關於作者:
Dino Esposito是一個主要工作在意大利羅馬的培訓師和顧問。他也是即將被Microsoft出版社發行的ADO.NET書籍的作者,他花費了大部分的時間在為Wintellect網站教ASP.NET和ADO.NET課程。如果你有一些技術問題,你可以用dinoe@wintellect.com電子郵件地址聯絡他。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。