四個提高C編程技巧的基本方法
在C編程中,有一些技巧可以幫助我們更好地編寫代碼,并提高程序的穩定性和可用性。本文將介紹四個基本技巧:使用接口編程、使用屬性代替原始數據、在Producer/Consumer模式中使用Delegate
在C編程中,有一些技巧可以幫助我們更好地編寫代碼,并提高程序的穩定性和可用性。本文將介紹四個基本技巧:使用接口編程、使用屬性代替原始數據、在Producer/Consumer模式中使用Delegate以及注意初始化順序。
一、盡量使用接口來編程
在編寫程序時,我們常常會遇到需要修改代碼以適應不同的集合類型的情況。如果我們使用.NET支持的接口而不是其類來編程,代碼會變得更加穩定、可用性也會更高。例如,下面的代碼從一個數組中加載ListBox:
```
private void LoadList(object[] items, ListBox l)
{
for (int i 0; i < items.Length; i )
(items[i].ToString());
}
```
但假設這些對象存在于數據庫或其他集合中,那么就需要修改程序來支持不同的集合類型。如果我們使用ICollection接口來編寫這段代碼,就可以不需要修改它來適應任何實現ICollection接口的類型:
```
private void LoadList(ICollection items, ListBox l)
{
foreach (object o in items)
(());
}
```
通過使用接口編程,我們可以增強代碼的靈活性和可擴展性。
二、使用屬性代替原始數據
因為屬性已成為C語言的元素,聲明數據元素時無需將其作用域等級設置高于private。相反,屬性使得數據元素更具封裝性,可以使用lazy evaluation來返回數據。此外,屬性可以是virtual或abstract,也可以在接口中定義。
然而,需要注意的是,將數據元素變成屬性后,客戶端程序便無法訪問服務端的新版本程序。對于在Web service中想實現序列化的值,可以將它們變成屬性來使用。
例如,我們可以通過以下代碼將數據元素私有化:
```
private int TheMonth 0;
[XmlAttribute("Month")]
public int Month
{
get { return TheMonth; }
set { TheMonth value; }
}
```
三、在Producer/Consumer模式中使用Delegate
在實現producer模式時,我們可以使用Delegate來通知consumer。這種方法相對于使用接口更加靈活,Delegate是多點傳送的,所以不需要額外的代碼即可支持多用戶。相對于使用接口,這樣做可以降低類之間的耦合度。
例如,下面的類處理鍵盤輸入并將其傳給所有registered listeners:
```
public class KeyboardProcessor
{
private OnGetLine theFunc null;
public OnGetLine OnGetLineCallback
{
get { return theFunc; }
set { theFunc value; }
}
public void Run()
{
string s;
do
{
s ();
if (s.Length 0)
break;
if (theFunc ! null)
{
[] funcs ();
foreach (OnGetLine f in funcs)
{
try
{
f(s);
}
catch (Exception e)
{
Console.WriteLine("Caught Exception: {0}", );
}
}
}
} while (true);
}
}
```
任何數目的listeners都可以注冊到producer,它們所要做的只是提供一個特定的函數:delegate。
四、注意初始化順序
在C中,有些變量聲明加入了initializer的概念。它們在構造函數之前被執行,實際上變量在基類的構造函數執行前之前被初始化。
因此,在初始化變量時應當避免使用基類中的數據,因為它們還沒有被構造。
總結
以上四個技巧都有助于我們更好地編寫C代碼,并提高程序的穩定性和可用性。通過使用接口編程、使用屬性代替原始數據、在Producer/Consumer模式中使用Delegate以及注意初始化順序,我們可以使程序更加靈活、功能更加完善。