Hallo, ich bin gerade bei der implementation einer Klasse, die ein readonly-Array zurück geben soll. Die ReadOnlyCollection kann ich leider nicht verwenden, da die Anforderung ist, dass die Rückgabe Klasse[] ist.
Eine Property IsReadOnly hat das Array, aber diese ist ja leider schreibgeschützt.
Daher meine Frage, da ich nirgendwo etwas finden kann, wie erstelle ich ein Array bei dem "IsReadOnly" true ist?
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Hallo inflames2k,
Zitat von: Array.IsReadOnly-Eigenschaft
Diese Eigenschaft ist für alle Arrays immer false.Array implementiert die IsReadOnly-Eigenschaft, da sie von der System.Collections.IList-Schnittstelle benötigt wird.
Verwenden Sie eine System.Collections-Klasse, die die System.Collections.IList-Schnittstelle implementiert, wenn Sie eine schreibgeschützte Auflistung benötigen.
Gruß
Michael
Du kannst doch einfach eine klassische readonly variable erstellen aller:
public readonly int[] myArray = {0, 0, 0, 0};
Hi Blue_Dragon,
ich denke, es geht darum, die einzelnen Werte des Arrays schreibgeschützt zu machen, nicht das Array selbst. Deswegen fällt mir auch nur die ReaqOnlyColection<T> ein.
Christian
Weeks of programming can save you hours of planning
Hallo zusammen,
und genau dafür gibt es die Array.AsReadOnly<T>()-Methode 😉
Und inflames2k, gib doch anstatt Klasse[] eine IList<Klasse> zurück.
da die Anforderung ist, dass die Rückgabe Klasse[] ist.
Im Normalfall würde ich in diesem Fall einfach ein IEnumerable<Klasse> zurückgeben - wenn das nicht geht, kopiere das Array einfach.
Dann kann es der Aufrufer ganz normal verwenden (ein ReadOnly Array wäre ja auch irgendwie ein wenig unerwartet 😉 ), hat aber dennoch keinen Zugriff auf die Internas deiner Klasse.
Hallo winSharp93,
Im Normalfall würde ich in diesem Fall einfach ein IEnumerable<Klasse> zurückgeben
für Parameter ist es sicher gut, den allgemeinsten Typ zu verwenden, mit dem die Implementierung der Methode noch problemlos möglich ist. Für Rückgabewerte sehe ich das anders. Der allgemeinste Typ macht es dem Aufrufer oft unnötig schwer, z.B. wenn er im konkreten Fall Indexzugriffe braucht. Aber wie allgemein oder konkret Parameter und Rückgabe-Typen sein sollten, brauchen wir hier nicht zu vertiefen. Das wurde schon in IList<T> oder List<T> als Parameter- bzw. Rückgabetyp? und weiteren Threads besprochen.
Beim Kopieren muss man bedenken, dass man dadurch die Aufwandsklasse der Operation von O(1) auf O(n) erhöht. Wenn jemand diese Operation in einer Schleife benutzt, erhöht sich der Aufwand der Schleife (vereinfacht gesprochen) von O(n) auf O(n^2) und kann damit schon ab überschaubaren Längen von vielleicht 10000 Elementen zu Performance-Problemen führen. Zwar wird call- und return-by-value gerne als Ersatz für const verwendet, aber gerade bei Listen, großen Objekten oder Objektbäumen ist der Rat nicht ohne potenzielle Nebenwirkungen.
herbivore
Ich werd mal mit dem Designer der Klasse sprechen wie er sich das genau vorgestellt hat. 😃
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |