c 中,如何判斷乙個類是否可以通過索引器取值?

時間 2022-01-23 05:00:33

1樓:智源小叔父

當乙個類包含陣列成員時,索引器的使用將大大簡化對類中陣列成員的訪問。定義類似於屬性也具有get和set訪問器。具體定義如下:

[修飾符]資料型別 this[索引型別 index]set{}

}索引器可以讓我們像訪問陣列一樣訪問類中的陣列成員。

2樓:深秋的黎明

簡單點來說是因為IList定義了T this[int index]方法,Array、Dictionary、List都實現了IList的T this[int index]方法。而IGrouping沒有定義T this[int index]方法。

3樓:khm1600

如果乙個型別上有System.Reflection.DefaultMemberAttribute ,並且MemberName 是乙個有參例項屬性或乙個有參例項屬性的.

get或.set訪問器(不包括.other),並且這個屬性有.

get或.set,那麼這個型別的值就是可以用索引器的。比如:

[

.Reflection

.DefaultMember

("X"

)>]type

public

Foo=

member

public

__.X

with

getx

:int=x

和Public

Class

BarPublic

PropertyX(

yAsInteger)As

Integer

GetReturn

yEnd

GetSet

(value

AsInteger

)End

SetEnd

Property

EndClass以及[

System

::Reflection

::DefaultMember

("set_X"

)]public

refclass

Baz};

甚至.class public auto ansi beforefieldinit Foobar extends [mscorlib]System.Object

{ .custom instance void [mscorlib]System.Reflection.

DefaultMemberAttribute::.ctor(string) = (01 00 01 58 00 00)

.method public hidebysig specialname instance int32 get(int32 x) cil managedldarg.1

retmethod public hidebysig specialname rtspecialname instance void .ctor() cil managedldarg.0

call instance void [mscorlib]System.Object::.ctorretmethod public hidebysig instance void Y() cil managedretproperty instance int32 X(int32 xget instance int32 Foobar::

get(int32other instance void Foobar::Y

都是可以用索引器的。

4樓:czh098tom

IEnumerable介面,顧名思義,只宣告了乙個集合或假想中存在的集合是可以遍歷的,即可以通過迴圈來訪問集合中的所有元素,至於這麼訪問的、訪問的是什麼順序的、每次訪問的時候是不是返回統一結果,都可以隨意處理。索引器要求的是一種隨機訪問的能力,而這是IEnumerable的宣告中並不具備的,所以IEnumerable介面必然不會要求實現索引器。

具體一點講,IGrouping產生自LINQ的GroupBy擴充套件方法,它應用在乙個任意的實現了IEnumerable介面的集合上,這個集合本身的情況是未知的,因此在這種情況下也不能期望IGrouping一定是具有隨機訪問能力的,故不會設計乙個隨機訪問能力給它。

(甚至更離譜的是,因為LINQ是惰性求值的,所以IGrouping物件生成的時候查詢實際並未執行,只有在呼叫IGrouping.GetEnumerator之後才執行)

5樓:

如果是執行時中要判斷的話可以去判斷乙個特殊的方法MethodImplAttributes Enum (System.Reflection)

MethodAttributes Enum (System.Reflection)

MethodBase.IsHideBySig Property (System.Reflection)

不過我看你的需求應該不是追求執行時?一般來說查查文件都會說。

6樓:

因為 IEnumerable 介面本來就沒有要求實現索引器。

具體說 IGrouping ,如果你已經要呼叫索引器查詢具體值,此時應該先用 linq 提供的方法轉換成字典等其他型別再做查詢。

7樓:旋鈕

索引器不是IEnumerable帶的,它乙個只關注遍歷的非常底層的介面,不可能帶索引這種高階貨,就算是更高一級的ICollection都沒有,得到IList/IDictionary這一級的才定義了索引器,所以這就是有些可以有些不可以的原因,它們實現的起點不同。至於如何判斷,就是看它有沒有定義,編輯器裡直接敲方括號就知道,或者F12或者看文件,或者走反射判斷有沒有GetIndexParameters().Length !

= 0的屬性,方法多的是。

8樓:main

你的問題已經回答了你

索引器就是屬性,不能索引說明這個類沒有做這個屬性就像乙個類沒有某個方法一樣,沒有某個方法你就點不出來,但方法可以自定義擴充套件,而屬性和索性沒有辦法擴充套件

你可以在外面再套一層實現類

C 裡,如何在乙個類廠裡,用靜態方式判斷乙個類是否繼承自某個類??

dodoleon 直接用c 11的 std is base of 就可以判斷是否是通過乙個基類繼承下來的。 Certain Y template size t m constexpr auto string equal const char value n const char o m for in...

如何通過走姿判斷乙個人是否習武?

福州禪武 國家武術散打隊黨支部全體成員參觀了八路軍西安辦事處。你看他們的站姿是不是很想打架的感覺,下次我遇到散打專業運動走路的動態再補上。 執悲今厄 五種情況 遇險 躲避 出腿 出拳 呼吸。一,當遭遇突發情況時 習武者 雙膝微曲。普通人 全身繃直。二,當躲避攻擊時 習武者 跨步,曲膝向前。普通人 不...

c 中能否判斷乙個指標指向棧還是堆?

Rico 如果假定指標非堆即棧,不考慮 code bss mmap 這些段位址的話,應該是可以的。提供乙個思路 1 讀取暫存器狀態 2 通過 rbp ebp 回溯堆疊,找到頂級堆疊的 ebp,也就是整個程序 執行緒 的堆疊起始位址 3 使用指標位址與堆疊起始位址比較,差值與平台相關的最大堆疊size...