C 物件導向 索引器

2021-10-12 19:00:02 字數 2286 閱讀 2920

一、索引器(indexer)允許類和結構的例項像陣列一樣通過索引取值,可以看做是對運算子的過載,索引器實際上就是有引數的屬性,也被稱為有參屬性或索引化屬性,其宣告形式與屬性相似,不同之處在於索引器的訪問器需要傳入引數;

1.宣告索引器:

class

myclass

set}

}//使用索引器:

myclass myclass =

newmyclass()

;myclass[0]

="1"

;console.

writeline

(myclass[0]

);//1

※屬性和索引器都不被當作變數,二者都是在基於方法實現的,因此無法將屬性或索引器作為引用引數、引用返回值、引用區域性變數來傳遞和使用;

※索引器只能宣告為例項成員,不能宣告為靜態的;

※索引器不支援自動實現;

※索引器只是在呼叫的寫法上與陣列相同,但實現原理與陣列完全不同,二者不可混淆;

2.宣告泛型版本的索引器:

class

myclass

set}

}//使用索引器:

myclass<

string

> myclass =

newmyclass

<

string

>()

;myclass[0]

="1"

;console.

writeline

(myclass[0]

);//1

3.索引器不僅可以根據整數進行索引,還可以vb.net教程根據任何型別進行索引,同時索引器也支援過載,類似於方法的過載,需要c#教程引數列表不完全相同,例如:

public

intthis

[string content]

}

4.索引器同時也支援引數列表有多個引數,類似於使用多維陣列,例如:

string[,

] myarray =

newstring

[100

,100];

public

string

this

[int posx,

int posy]

set}

//使用索引器:

myclass myclass =

newmyclass()

;myclass[0,

0]="1"

;console.

writeline

(myclass[0,

0]);

//1

二、索引器實際上就是有引數的屬性,其屬性名固定為item,通過反射獲取myclass的屬性資訊陣列即可看到:

type mytype =

typeof

(myclass)

;propertyinfo[

] myproperties = mytype.

getproperties()

;for

(int i =

0; i < myproperties.length; i++

)

1.通過反射呼叫索引器獲取值:

myclass myclass =

newmyclass()

;for

(int i =

0; i <

100; i++

)propertyinfo data = mytype.

getproperty

("item");

//如果索引器包含過載,例如上面this[string content]的例子,那麼使用getproperty的過載方法傳入引數列表的型別陣列來獲取指定索引器mytype.getproperty("item", new type )

string mystr =

(string

)data.

getvalue

(myclass,

newobject

);//第二個引數即索引器引數

console.

writeline

(mystr)

;//5

2.檢視其il**:

C 物件導向 12 索引器

1 c 中提供了按照索引器進行訪問的方法。2 定義索引器的方式 string this int index set string為索引器的型別,中是引數列表。進行索引器寫操作就是呼叫set 塊,在set內部使用value得到使用者設定的值 進行讀操作就執行get 塊。3 索引器引數可以不止乙個,型別...

物件導向基礎 索引器

c 中的string是可以通過索引器來訪問物件中的字元,但卻不能修改字元的值。我們來看string中關於索引器的定義,如下圖。上圖中索引器如同屬性一樣,具有get方法,卻沒有set方法,所以這就是為什麼c 中的string型別的變數都是唯讀的。現在讓我們來編寫屬於自己的索引器 1 class pro...

c 陣列賦初值 C 物件導向 索引器

索引器 封裝了類的私有陣列的操作,沒有名字 定義索引器的格式 public 陣列中元素的資料型別 關鍵字 this 下標 get 根據下標獲取陣列中該下標所對應的元素 先判斷下標是否越界 if 下標 私有陣列元素的個數 throw new indexoutofrangeexception 陣列越界 ...