this關鍵字和索引器

2021-08-15 23:23:19 字數 4700 閱讀 5109

一、this關鍵字

在c#中,this關鍵字有以下3種常見的用法:

1.用在類的屬性、例項方法或例項構造方法中,區分成員名和本地變數(或引數)。下面的示例宣告乙個名為myclass的類,類中包括乙個例項欄位myval和乙個例項建構函式,該建構函式帶乙個名為myval的引數,在方法中,通過this可以在語義上區分成員名myval和引數名myval。(注意:在實際程式設計中是不建議引數名和欄位名相同的,這樣做降低了**的易讀性,這裡只是為了說明this關鍵字的用法而已)。

? 1

2

3

4

5

6

7

8

9

10

11

12

13

1classmyclass

2

13}

2.this表示的是當前物件,可以把它作為實參傳遞到其它方法。例如下面宣告乙個類myclass1,它包括乙個例項成員方法compute,而compute帶乙個型別為myclass的引數,該引數在方法中參加運算。

? 1

2

3

4

5

6

7

8

9

10

11

12

13

1classmyclass1

2

11returnresutl;

12}

13}

下面在類myclass的構造方法中新增了乙個本地變數的宣告,該變數初始化的值來自myclass1的compute方法的計算結果。而這時就可以將this作為實參傳遞給呼叫方法了:

? 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

1classmyclass

2

16}

3.宣告索引器。接下來在第二部分當中分析索引器的宣告和使用方法。

此外,應當注意的一點:由於靜態成員函式存在於類一級,並且不是物件的一部分,沒有 this 指標,因此不能在靜態方法中使用this關鍵字。在靜態方法中引用 this 是錯誤的。

二、索引器

1.通過點運算子訪問例項成員

一般情況下,我們是通過點運算子(「例項名.成員名」)的方式來訪問類的例項成員的。比如下面的示例,該例中其實是通過呼叫屬性的set訪問器為成員字段賦值,並且通過get訪問器讀取成員欄位的值的。

1 class course

2 4 public float math

5 public float englisth

6 }7

8 class program

9 ,數學:,英語:", course.chinese, course.math, course.englisth);

22 console.readkey();

23 }

24 }

2.通過索引器訪問例項成員

通過觀察上面示例的**,可以發現:該類的所有成員具有相同的型別float,它們其實可以像訪問陣列一樣的方式訪問,所以,我們可以為類提供另一種例項成員訪問方式:索引器。下面的**為上面的course類宣告加上了乙個float型別的索引,並在main方法中通過索引訪問資料:

1 class course

2 4 public float math

5 public float englisth

67 // 宣告乙個公開的float型別的索引器

8 public float this[int index]

9 28 }

29 // get訪問器:取值

30 get

31 43 }

44 }

45 }

4647 class program

48 ,數學:,英語:", course[0], course[1], course[2]);

61 console.readkey();

62 }

63 }

3.什麼是索引?

上面已經宣告並且使用了索引,這裡分析總結索引的概念和特徵:

1).索引的概念

索引也是一種類成員,而且必須為例項成員,因為它就是為例項成員提供的一種訪問方式,所以不能宣告為static的。索引與屬性類似,也有get訪問器和set訪問器。而且索引實際上就是一組get訪問器和set訪問器,而訪問器的本質是方法,所以說,索引器的本質就是方法。索引器經常是在主要用於封裝內部集合或陣列的型別中宣告的。

2).索引宣告

索引宣告使用下面的語法:

[訪問修飾符] 返回值型別 this [ 引數1,引數2...]

set}

語法要點:索引名稱永遠為this;索引的引數在方括號中間;索引的引數列表中至少有乙個引數。

3).set訪問器

當索引被用於賦值時,它的set訪問器被隱式呼叫, set訪問器的特徵如下:

第一,它的返回值型別為void。

第二,它的引數列表和索引中宣告的引數列表的相同。

第三,它有乙個名為value的隱式值引數,引數型別和索引的型別相同。

4).get訪問器

當索引被用於取值時,get訪問器被隱式呼叫,get訪問器的特徵如下:

第一,它的返回值型別與索引型別相同。

第二,它的引數列表和索引中宣告的引數列表的相同。      

5).索引的安全性

在客戶端代通過索引訪問成員時,很可能發生索引越界等一些異常情況。有兩種方式提高索引的安全性:

第一,為索引宣告嚴格的訪問級別控制,比如可以將set訪問器的修飾符改為private。

1 // set訪問器:賦值

2 private set

3 19 }

第二,檢查成員的個數,或丟擲異常。

? 1

2

1// 索引越界時丟擲異常

2thrownewargumentoutofrangeexception();

6).索引過載

索引可以宣告多個引數,也可以過載,索引過載只要引數列表不同就行了。下面為course類宣告幾個索引的過載。

1 class course

2 4 public float math

5 public float englisth

67 // 宣告乙個公開的float型別的索引器

8 public float this[int index]

9 28 }

29 // get訪問器:取值

30 get

31 43 }

44 }

4546 // 索引過載

47 public float this[string name, float val]

48 65 }

66 get

67 79 }

80 }

8182 // 過載2:唯讀索引

83 protected string this[int index, string name, bool flag]

84 89 }

9091 }

三、索引器和屬性的比較

1.相同點

1).索引和屬性都不用分配記憶體位置來儲存。

2).索引和屬性都是為類的其它成員提供訪問控制的。

3).索引和屬性都有get訪問器和set訪問器,它們可以同時宣告兩個訪問器,也可以只宣告其中乙個。

2.不同點

1).屬性通常表示單獨的資料成員,而索引表示多個資料成員。

2).屬性既可以宣告為例項屬性,也可以宣告為靜態屬性,而索引不能宣告為靜態的。 

3).屬性有簡潔的自動實現屬性,而索引必須宣告完整。

4).get訪問器:屬性的 get 訪問器沒有引數,索引器的 get 訪問器具有與索引器相同的形參表。 

5).set訪問器:屬性的 set 訪問器包含隱式 value 引數。除了值引數外,索引器的 set 訪問器還具有與索引器相同的形參表。 

this關鍵字,抽象類和索引器

一 thi關鍵字 1 this只能在類的內部使用,使用他能訪問類例項物件內部任何級別 不同型別的訪問修飾符 的任何元素 字段,屬性,方法等 但 靜態的型別的成員不能訪問,因為靜態成員不屬於物件的一部分。msdn裡面是這樣介紹this關鍵字的 用來引用類的當前例項。2 乙個類可以例項化成很多物件,每個...

今日關鍵字 索引

上篇文章資訊檢索的過程中提到 索引 一次,可能大家對它還不太理解,我當時學習時也是很吃力的。所以特寫下這篇文章針對索引展開討論。q1.為什麼要提出索引的概念?a1.傳統的查詢,雖結構簡單,可當資料達到 tb級別時,查詢速度是無法忍受的。於是索引便運應而生了。它大大提高了檢索速度。q2.什麼是索引?a...

this關鍵字和super關鍵字

this關鍵字和super關鍵字都必須放在構造方法的第一行,所有兩個關鍵字不能同時存在,任選其一即可,只需保證子類的所有構造方法呼叫父類的構造方法即可 this關鍵字的應用 this關鍵字用於區分區域性變數和成員變數的同名問題 有this關鍵字的是成員變數,或者是誰呼叫我,訪問的就是誰 this關鍵...