1.9 結構(Structs)
結構和類又非常多的相似之處,如結構可以實現界面,和可以擁有和類一樣的成員。結構與類也有一些重要的區別:結構是值類型,而不是引用類型,所以不支持繼承!結構被存在堆棧中或者是內聯。結構在精心下可以提高存儲效能。例如,定義一個與類有著相同信息的結構可以大大地減少存儲空間。在下例中,程序創建並初始化100個points。在類“Point”中需要分配101個獨立的對象(object)。*/
class Point
{
public int x, y;
public Point() {
x = 0;
y = 0;
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Test
{
static void Main() {
Point[] points = new Point[100];
for (int i = 0; i < 100; i++)
points[i] = new Point(i, i*i);
}
}
/*
如果“Point”被作為一個結構,就可以這樣啦:*/
struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
/*
因為Point在內聯中實例化,所以得到了優化。當然,錯誤運用的只會適得其反。比如,當我們傳遞結構的時候就會比傳遞類要慢。因為結構的傳遞是拷貝值,類是引用值的地址。數據量越大差距就越明顯。
所以“There is no substitute for careful data structure and algorithm design.”(實在是不想譯了 ^_^ )。
1.10 界面(Interfaces)
界面用來定義一種程序的契約。有了這個契約,就可以跑開編程語言的限制了(理論上)。而實現界面的
類或者結構要與界面的定義嚴格一致。界面可以包含以下成員:方法、屬性、索引和事件。例子:*/
interface IExample
{
string this[int index] { get; set; }
event EventHandler E;
void F(int value);
string P { get; set; }
}
public delegate void EventHandler(object sender, Event e);
/*
例子中的界面包含一個索引、一個事件E、一個方法F和一個屬性P。
界面可以支持多重繼承。就像在下例中,界面“IComboBox”同時從“ITextBox”和“IListBox”繼承。
*/
interface IControl
{
void Paint();
}
interface ITextBox: IControl
{
void SetText(string text);
}
interface IListBox: IControl
{
void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}
/*
類和結構可以多重實例化界面。 就像在下例中,類“EditBox”繼承了類“Control”,同時從“IDataBound”和“IControl”繼承。
*/
interface IDataBound
{
void Bind(Binder b);
}
public class EditBox: Control, IControl, IDataBound
{
public void Paint();
public void Bind(Binder b) {...}
}
/*
在上面的代碼中,“Paint”方法從“IControl”界面而來;“Bind”方法從“IDataBound”界面而來,都以“public”的身份在“EditBox”類中實現。