第九章 泛型

2021-07-10 03:04:54 字數 3501 閱讀 8729



1>介紹泛型的優點和缺點,尤其是:

● 效能

● 型別安全性

● 二進位制**重用

● **的擴充套件

● 命名約定

2>對值型別使用非泛型集合類,在把值型別轉換為引用型別,和把引用型別轉換為值型別時,需要進行裝箱和拆箱操作。

注意:值型別儲存在堆疊上,引用型別儲存在堆上。 c#類是引用型別,結構是值型別。 

從值型別轉換為引用型別稱為裝箱。如果方法需要把乙個物件作為引數,而且傳送了乙個值型別,裝箱操作就會自動進行。另一方面,裝箱的值型別可以使用拆箱操作轉換為值型別。在拆箱時,需要使用型別轉換運算子。

1,例子顯示了 system.collections 命名空間中的 arraylist 類。 arraylist 儲存物件,add()方法定義為需要把乙個物件作為引數,所以要裝箱乙個整數型別。在讀取 arraylist中的值時,要進行拆箱,把物件轉換為整數型別。可以使用型別轉換運算子把 arraylist集合的第乙個元素賦予變數 i1,在訪問 int 型別的變數 i2 的 foreach 語句中,也要使用型別

轉換運算子:

```arraylist list = new arraylist();

list.add(44);

int i1 = (int)list[0];

foreach (int i2 in list)

```system.collections.generic 命名空間中的 list>

類不使用物件,而是在使用時定義型別。在下面的例子中, list>

類的泛型型別定義為 int,所以 int 型別在 jit 編譯器動態生成的類中使用,不再進行裝箱和拆箱操作:

```listlist = new list();

list.add(44);

int i1 = list[0];

foreach (int i2 in list)

```3>命名約定

泛型型別的命名規則:

● 泛型型別的名稱用字母 t 作為字首。

● 如果沒有特殊的要求,泛型型別允許用任意類替代,且只使用了乙個泛型型別,就可以用字元 t 作為泛型型別的名稱

```public class list

public class linkedlist

```● 如果泛型型別有特定的要求(例如必須實現乙個介面或派生於基類),或者使用了兩個或多個泛型型別,就應給泛型型別使用描述性的名稱:

```public delegate void eventhandler(object sender, teventargs e);

public delegate toutput converter(tinput from);

public class sortedlist

```1)建立泛型類

在鍊錶中,乙個元素引用其後的下乙個元素。所以必須建立乙個類,將物件封裝在鍊錶中,引用下乙個物件。類 linkedlistnode 包含乙個物件 value,它用建構函式初始化,還可以用 value 屬性讀取。另外, linkedlistnode 類包含對鍊錶中下乙個元素和上乙個元素的引用,這些元素都可以從屬性中訪問.

```public class linkedlistnode

public object value

}private linkedlistnode next;

public linkedlistnode next

internal set

}private linkedlistnode prev;

public linkedlistnode prev

internal set }}

```linkedlist 類包含 linkedlistnode 型別的 first 和 last 字段,它們分別標記了鍊錶的頭尾。 addlast()方法在鍊錶尾新增乙個新元素。首先建立乙個 linkedlistnode 型別的物件。如果鍊錶是空的,則 first 和 last 欄位就設定為該新元素;否則,就把新元素新增為鍊錶中的最後乙個元素。執行 getenumerator()方法時,可以用 foreach 語句迭代鍊錶。 getenumerator()方法使用 yield 語句建立乙個列舉器型別。

4>繼承

(1)建立的 linkedlist>

類執行了 ienumerable>

介面:```

public class linkedlist: ienumerable

public class derived: base

```其要求是必須重複介面的泛型型別,或者必須指定基類的型別,如下所示:

```public class base

public class derived: base

```派生類可以是泛型類或非泛型類。例如,可以定義乙個抽象的泛型基類,它在

派生類中用乙個具體的型別實現。這允許對特定型別執行特殊的操作:

```public abstract class calc

public class ******calc : calc

public override int sub(int x, int y)

}```

5>靜態成員

(1)泛型類的靜態成員只能在類的乙個例項中共享。下面看乙個例子。 staticdemo>

類包含靜態字段 x:

```public class staticdemo

```由於對乙個 string 型別和乙個 int 型別使用了 staticdemo>

類,所以存在兩組靜態字段:

```staticdemo.x = 4;

staticdemo.x = 5;

console.writeline(staticdemo.x);

```6>泛型介面

(1)使用泛型可以定義介面,介面中的方法可以帶泛型引數。在鏈表示例中,就執行了ienumerable>

介面,它定義了 getenumerator()方法,以返回

ienumerator>

。```

public inte***ce icomparable

```第 5 章中的非泛型介面 icomparable 需要乙個物件, person 類的 compareto()方法才能按姓氏給人員排序:

```public class person : icomparable

//...

```7>泛型方法

除了定義泛型類之外,還可以定義泛型方法。在泛型方法中,泛型型別用方法宣告來定義。

swap>

方法把 t 定義為泛型型別,用於兩個引數和乙個變數 temp:

```void swap(ref t x, ref t y)

```把泛型型別賦予方法呼叫,就可以呼叫泛型方法:

```int i = 4;

int j = 5;

swap(ref i, ref j);

```泛型方法可以像非泛型方法那樣呼叫:

```int i = 4;

int j = 5;

swap(ref i, ref j);

```

第九章(筆記)

轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...

第九章作業

班級 0401304 學號 2013211526 姓名 鄧小俊 2.身份驗證 依據使用者所提供的身份資訊,來進行登入驗證,可以再細分為使用者是否可以登入sql sever 使用者是否可以登入到指定的目標資料庫等。授權 已通過身份驗證的使用者,檢查其所被賦予的許可權,是否可以訪問或者執行目標的物件 3...

第九章 引用

引用擁有指標的所有功能,只是語法更加的簡單 1 引用就是別名,變數的另外乙個名字,變數和別名它們的位址是一樣的,操作別名就是操作變數 2 引用就是別名常量,一旦引用被初始化就不能再改變了 可以理解為指標常量,指向的值不能改變,能改變的只是它的該位址處的值 3 引用物件huamn mike human...