Laden...

Array.IsReadOnly - wie erstellen?

Erstellt von inflames2k vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.479 Views
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 12 Jahren
Array.IsReadOnly - wie erstellen?

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 |

1.552 Beiträge seit 2010
vor 12 Jahren

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

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

B
198 Beiträge seit 2005
vor 12 Jahren

Du kannst doch einfach eine klassische readonly variable erstellen aller:

 public readonly int[] myArray = {0, 0, 0, 0};
5.657 Beiträge seit 2006
vor 12 Jahren

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

4.837 Beiträge seit 2008
vor 12 Jahren

Hallo zusammen,

und genau dafür gibt es die Array.AsReadOnly<T>()-Methode 😉

Und inflames2k, gib doch anstatt Klasse[] eine IList<Klasse> zurück.

5.742 Beiträge seit 2007
vor 12 Jahren

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.

49.485 Beiträge seit 2005
vor 12 Jahren

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

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 12 Jahren

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 |