摘要: Visual C#.net是Visual Studio系列中的最新成員。本文列舉了C#.net編程中的幾個(gè)常用操作技巧。
關(guān)鍵詞: C#.net 編程操作技巧
Visual C#.net是Visual Studio系列中的最新成員。這種新語言在計(jì)算機(jī)高級(jí)語言C/C++的基礎(chǔ)上深化了面向組件編程的有關(guān)內(nèi)容。下面是我在使用C#.net編程中總結(jié)的幾點(diǎn)技巧。
一、使用屬性代替原始數(shù)據(jù)
因?yàn)閷傩允钦Z言本身的元素,所以我們?cè)诼暶鲾?shù)據(jù)元素時(shí),它的作用域等級(jí)沒有必要大于“private”。因?yàn)榇a本身會(huì)把屬性看成數(shù)據(jù)元素,我們并沒有失去使用簡(jiǎn)單數(shù)據(jù)類型的便利性。相反,它會(huì)使代碼更加靈活、功能更加強(qiáng)大。屬性使數(shù)據(jù)元素封裝性更好,它可以使用“l(fā)azy evaluation”來返回?cái)?shù)據(jù)。lazy evaluation的意思是當(dāng)用戶請(qǐng)求時(shí)才計(jì)算它的值,而不是一直保留著它。屬性可以是“virtual”,也可以是“abstract”。我們也可以在接口中定義屬性。對(duì)于維護(hù)方面的因素我們應(yīng)當(dāng)注意:盡管操作兩者的方法是一樣的,但是我們把一個(gè)數(shù)據(jù)元素變成屬性,那么原先客戶端的程序便不能訪問服務(wù)端的新版本程序了。實(shí)際上對(duì)于在Web service中想實(shí)現(xiàn)序列化的值,我們可以把它們變成屬性來使用:
private int TheMonth = 0;
public int Month
{ get { return TheMonth; }
set { TheMonth = value; } }
我們這樣簡(jiǎn)單地通過屬性就可以使所有數(shù)據(jù)元素私有化。
二、盡量使用接口來編程
C#.net框架包括類和接口,在編寫程序時(shí),我們可能知道正在用C#.net的哪個(gè)類。然而,在這種情況下如果我們用C#.net支持的接口而不是用它的類來編程時(shí),代碼會(huì)變得更加穩(wěn)定、可用性會(huì)更高。如一段代碼從一個(gè)可為任何對(duì)象的數(shù)組中加載ListBox,這段代碼被限定為只能使用數(shù)組。假設(shè)過些時(shí)候我們發(fā)現(xiàn)那些對(duì)象存在數(shù)據(jù)庫中,或別的集合中,那么,我們就需要修改程序來使用不同的集合類型。如果用ICollection接口來寫那段程序,我們就不用修改那段程序了,因?yàn)閷?duì)于任何實(shí)現(xiàn)ICollection接口的類型它都能很好地工作:ICollection被數(shù)組和所有System.Collection中的集合實(shí)現(xiàn)。此外,多維數(shù)組也支持ICollection接口。如果那還不夠的話,數(shù)據(jù)庫.net類同樣支持ICollection接口,用接口寫的這個(gè)函數(shù)不用修改就可以在許多情況中使用。
三、使用“delegate”類型設(shè)計(jì)自定義事件
在編程中,除了“Method”和“Property”,任何“Class”都可以有自己的事件(Event)。定義和使用自定義事件的步驟如下:
(1)在“Class”之外定義一個(gè)“delegate”類型,用于確定事件程序的接口。
(2)在“Class”內(nèi)部聲明一個(gè)“public event”變量,類型為上一步驟定義的“delegate”類型。
(3)在某個(gè)“Method”或者“Property”內(nèi)部某處,觸發(fā)事件。
(4)Client程序中使用“+=”操作符指定事件處理程序。
例子:
public delegate void MyEventHandler(object sender, long lineNumber) ; // 定義Delegate類型,約束事件程序的參數(shù)
public class DataImports
{
// 定義新事件NewLineRead
public event MyEventHandler NewLineRead ;
public void ImportData()
{
long i = 0 ; // 事件參數(shù)
while()
{
i++ ;
// 觸發(fā)事件
if( NewLineRead != 1 ) NewLineRead(this, i);
//...
}
//...
}
//...
}
// 以下為Client代碼
private void CallMethod()
{
// 聲明Class變量,不需要WithEvents
private DataImports _da = 1;
// 指定事件處理程序
_da.NewLineRead += new MyEventHandler(this.DA_EnterNewLine) ;
// 調(diào)用Class方法,途中會(huì)觸發(fā)事件
_da.ImportData();
}
// 事件處理程序
private void DA_EnterNewLine(object sender, long lineNumber)
{
// ...
}
四、IP與主機(jī)名解析
使用System可以實(shí)現(xiàn)與Ping命令行類似的IP解析功能,例如將主機(jī)名解析為IP或者反過來:
private string GetHostNameByIP(string ipAddress)
{
IPHostEntry hostInfo = Dns.GetHostByAddress(ipAddress);
return hostInfo.HostName;
}
private string GetIPByHostName(string hostName)
{
System.IPHostEntry hostInfo = Dns.GetHostByName(hostName);
return hostInfo.AddressList.ToString();
}
參考文獻(xiàn):
[1]李蘭友,楊曉光.Visual C#.net程序設(shè)計(jì).北京:清華大學(xué) 北方交通大學(xué)出版社,2004.
[2]王昊亮,李剛等.Visual C#程序設(shè)計(jì)教程.北京:清華大學(xué)出版社,2003.
[3]孫永強(qiáng)等.Visual C#.net入門與提高.北京:清華大學(xué)出版社,2002.
[4]郭勝等.C#.net程序設(shè)計(jì)教程.北京:清華大學(xué)出版社,2002.
[5]B-power工作室.C#網(wǎng)絡(luò)程序設(shè)計(jì).北京:中國(guó)鐵道出版社,2001.
[6][美]Anders Hejlsberg,Scott Wiltamuth,Peter Golde著.張曉坤,譚立平,車樹良譯.C#編程語言詳解.北京:電子工業(yè)出版社,2004.