C 有參屬性(索引器)

2022-01-13 12:22:10 字數 2304 閱讀 1566

無參屬性大家可以參考比對下。

今天又翻了翻書,看看有參屬性(索引器)跟無參屬性有啥區別。

屬性的get訪問器方法不接受引數,所以我們將這些屬性稱為無參屬性,因為無參屬性與字段的訪問有些相似,所以這些屬性很容易理解。

除了這些與字段訪問有些相似的屬性,c#還支援有參屬性(索引器),它的get訪問器方法接受乙個或多個引數,set訪問器方法接受兩個或多個引數。

c#使用陣列風格的語法來公開有參屬性,可以把索引器看作c#過載操作符的一種方式。

class test

public test(int len)

length = len;

nums = new

int[length];}//

[indexername("nums")]

public

intthis[int post]

else }

set else }

}public

string

this[int i, string s]

set }}

class program

,setmethod的名稱:

", p.getgetmethod().name, p.getsetmethod().name);

}test t = new test(15);

for (int i = 0; i < 15; i++)

console.readkey();

}}

所有索引器至少要有乙個引數,可以有更多,這些引數和返回型別可以是除了void以外的任意型別。在system.drawing.imaging.colormatrix類中,提供了乙個有多個引數的乙個索引器的例子 ,大家可以去參考下 :

public

float

this[int row, int column]

set}

經常要建立索引器來查詢關聯陣列中的值,system.collections.generic.dictionary類就提供了這樣的乙個索引器,它獲取乙個值,並返回與該鍵關聯的值。

public tvalue this[tkey key]

return &(this.entries[num]).value;

label_001e:

throwhelper.throwkeynotfoundexception();

return

default(tvalue);

}set

}

和無參屬性不同,型別可以提供多個過載的索引器,只要這些索引器的簽名不同。

clr本身並不區分無參屬性和有參屬性,對於clr來說屬性就是型別中定義的一些方法和一些元資料。c#只允許在物件的例項上定義索引器,c#沒有提供定義靜態索引器屬性的語法,但是clr是支援靜態有參屬性的。

由於c#的索引器語法不允許開放人員指定索引器名稱,所以編譯器就為索引器選擇了乙個預設的名稱,如果你注意過你應該發現了吧:item,編譯器生成的方法名就是get_item,set_item。從第一段**就能發現了

使用c#永遠不會看到item這個名稱,所以一般不需要關心編譯器選定的這個名稱,但是如果為乙個型別設計的索引器要是有其他語言的**訪問,就可能需要更改索引器的預設item名稱了。c#允許向索引器應用system.runtime.complierservices.indexernameattribute定製attribute來重新命名這些方法。

[indexername("nums")]

public

intthis[int post]

else }

set else }

}

public

string

this[int i, string s]//

如果這裡不使用indexername修改預設的item為nums就會報錯:「兩個索引器的名稱不同;在型別中的每個索引器上的indexername特性都必須使用相同的名稱。」因為乙個型別中可以定義多個索引器,只要索引器的引數集不同就行了,其他語言中indexername屬性允許定義多個具有相同簽名的索引器,每個索引器有不同的名稱,但是在c#中這是不允許的,因為它的語法不是通過名稱來引用索引器。

set

}

這裡編譯器就會生成名為get_nums,set_nums的方法,而不是預設的了。使用indexername 如果**中包含多個名稱不同的有參屬性,c#無法編譯**。

c#將索引器堪稱是對操作符的一種過載方式,而且操作符不能用來消除具有不同方法名和相同引數集的有參屬性的歧義。

C 索引器與屬性

索引器允許類或結構的例項按照與陣列相同的方式進行索引。索引器類似於屬性,不同之處在於它們的訪問器採用引數。屬性 class sampleclass set 索引器 索引器使得物件可按照與陣列相似的方法進行索引。get 訪問器返回值。set 訪問器分配值。this 關鍵字用於定義索引器。value 關...

c 屬性和索引器

1 屬性 所謂屬性其實就是特殊的類成員,它實現了對私有類域的受控訪問。在c 語言中有兩種屬性方法,其一是get,通過它可以返回私有域的值,其二是set,通過它就可以設定私有域的值。比如說,以下面的 為例,建立學生姓名屬性,控制對name欄位的受控訪問 2 索引器 簡單說來,所謂索引器就是一類特殊的屬...

c 屬性和索引器

1 屬性 所謂屬性其實就是特殊的類成員,它實現了對私有類域的受控訪問。在c 語言中有兩種屬性方法,其一是get,通過它可以返回私有域的值,其二是set,通過它就可以設定私有域的值。比如說,以下面的 為例,建立學生姓名屬性,控制對name欄位的受控訪問 code using system public...