一、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
1
class
myclass
2
13
}
2.this表示的是當前物件,可以把它作為實參傳遞到其它方法。例如下面宣告乙個類myclass1,它包括乙個例項成員方法compute,而compute帶乙個型別為myclass的引數,該引數在方法中參加運算。
? 1
2
3
4
5
6
7
8
9
10
11
12
13
1
class
myclass1
2
11
return
resutl;
12
}
13
}
下面在類myclass的構造方法中新增了乙個本地變數的宣告,該變數初始化的值來自myclass1的compute方法的計算結果。而這時就可以將this作為實參傳遞給呼叫方法了:
? 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
class
myclass
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
// 索引越界時丟擲異常
2
throw
new
argumentoutofrangeexception();
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關鍵...