Laden...

Kennt C# statische Arrays?

Erstellt von PaBa vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.200 Views
P
PaBa Themenstarter:in
7 Beiträge seit 2015
vor 8 Jahren
Kennt C# statische Arrays?

Hallo zusammen, ich nochmal. Wie ich schon in einem anderen Beitrag geschrieben habe, habe ich in der Schule etwas programmieren gelernt, aber eine andere Programmiersprache. Diese Programmiersprache kennt sowohl statische, wie dynamische Arrays.

Braucht man Arrays nur zwischen 100 und 200, kann man sie statisch vereinbaren, z.B.:

  a: array[100..200] of String;

Dynamisch geht es so:

  b: array of String;
  ...
  SetLength(b, 100);

Der Unterschied - statische Arrays decken einen definierten Bereich ab, können aber nicht erweitert werden. Dynamische fangen immer bei Null an, können aber erweitert werden.

Das einzige was ich bisher in C# gefunden habe sind dynamische Arrays. Übersehe ich da etwas oder kennt C# keine?

16.806 Beiträge seit 2008
vor 8 Jahren

Sowas hast Du üblicherweise in typisierten Hochsprachen nicht.
Ein fixed Array wie Du es hier zeigst deckt man in Hochsprachen üblicherweise mit einer typisierten Collections ab; je nach Inhalt mit eigenen Klassen.

74 Beiträge seit 2014
vor 8 Jahren

Auch in C# ist es so, dass wenn du ein Array z. B. mit var foo = new int[10]; deklarierst, es auch eine feste Größe hat. Es gibt zwar die Array.Resize-Methode, die kopiert das ursprüngliche Array allerdings einfach in ein neues.

Wie Abt schon geschrieben hat, kommt man (normalerweise) kaum mit blanken Arrays in Berührung, außer man macht irgendwelchen Low-Level-Kram oder etwas hoch optimiertes.

PS: So etwas wie a: array[100..200] of String; gehört für mich eindeutig zur Kategorie Features auf die man verzichten kann. Kann mir keinen Anwendungsfall vorstellen, wo es Sinn macht, die Indizes künstlich in einem Bereich festzulegen.

C
1.214 Beiträge seit 2006
vor 8 Jahren

Sowas hast Du üblicherweise in typisierten Hochsprachen nicht.

Als C++ Entwickler gefällt mir die Aussage so nicht. Und die gezeigte Syntax dürfte Pascal oder Delphi sein, ebenfalls "typisierte" Hochsprachen.

Arrays fester Größe gibts wie Lando geschrieben hat in C# schon. Nur braucht man sie tatsächlich kaum mal und verwendet meist Collections.
In C++ hätte so ein Konstrukt (aber nicht als C Arrays sondern gekapselt als stdarray<stdstring, 100>) den Vorteil, dass man das Ding auf dem Stack ablegen könnte und keine dynamische Speicherverwaltung involviert wäre. Und auf sowas achte ich üblicherweise schon, wenn ich C++ programmiere (und wenn jetzt mit Mikrooptimierungen kommt, mit solchen Optimierungen hab ich schon öfter Faktor 2-3 rausgeholt, mindestens). Diesen Vorteil hättest du in C# nicht, deswegen gibts auch kaum einen guten Grund, Arrays zu nehmen.

16.806 Beiträge seit 2008
vor 8 Jahren

In C++ ist das oben gezeigte möglich? Bei dem der Index bei 100 beginnt. Echt? 🤔
Oder erstellt array[100...200] anders als ich die Beschreibung verstanden habe einfach ein Array mit 100 Werten, wie Enumerable.Range(100,200) ?

Pascal oder gar Delphi eine Hochsprache zu nennen? Sorry: nein 😜 Oder zumindest jain.
Aber ok, gibt auch Leute, die nennen PHP eine Hochsprache. Die Definition is da wohl schwammig.

C
1.214 Beiträge seit 2006
vor 8 Jahren

Nein, ein Array von 100 bis 200 kann man in C++ nicht erstellen. Das war für mich nicht das entscheidende Kriterium.

Ok, darüber zu diskutieren was eine Hochsprache ist und was nicht, ist in der Tat schwierig. Ich habe mir bei der Aussage nicht viel gedacht, außer Hochsprache als Gegensatz zu Low Level Sprachen wie Assembler oder C. Aber wenn ich selber C rein subjektiv nicht unbedingt als Hochsprache sehe, dann gehört Pascal natürlich in dieselbe Kategorie.
Ich hab grob geschätzt acht Jahre lang Delphi programmiert und war damit ziemlich zufrieden. Vor allem zusammen mit der VCL muss man das eigentlich schon als Hochsprache sehen. Allerdings so im Nachhinein, nachdem ich auf C# und jetzt C++ umgestiegen bin, kommt mir das damalige Delphi schon ziemlich armselig vor. Es gab nicht mal Templates und die Collections waren nicht stark typisiert. Das ist natürlich ein sehr große Einschränkungen und ich weiß jetzt auch in der Tat nicht, ob ich das tatsächlich noch als Hochsprache bezeichnen will. Mittlerweile hat Delphi aber auch Generics.

16.806 Beiträge seit 2008
vor 8 Jahren

Nein, ein Array von 100 bis 200 kann man in C++ nicht erstellen. Das war für mich nicht das entscheidende Kriterium.

Ja also. Dann stimmt meine Aussage...

Das sieht für mich nach einer üblichen Script- oder iregdnwas funktionales wie TypeScript aus.
Da ist "..." üblich für ein Range. Und das hat man eben in typisierten Hochsprachen üblicherweise einfach nicht (mal sehen, wann und ob es in den C# Zucker wandert). Zudem eben der Index-Beginn, was zB auch bei JavaScript geht.

C
1.214 Beiträge seit 2006
vor 8 Jahren

@PaBa: ich habe noch mal deinen Beitrag gelesen und mir ist jetzt tatsächlich nicht mehr klar, worauf du eigentlich hinaus willst.
Statisch oder dynamisch hat nichts damit zu tun, ob die Arrays bei 0 oder bei einem anderen Index beginnen. Arrays, die nicht bei 0 beginnen kenne ich tatsächlich auch nur aus Pascal und halte das ebenfalls für völlig irrelevant.

1.361 Beiträge seit 2007
vor 8 Jahren

Um weitere Neuankömmlinge zusätzlich off-topic zu verwirren: Nonzero-Based Arrays sind auch in .NET spezifiziert und in C# erlaubt. Sie sind nur nicht CLS-konform, da nicht alle .NET Sprachen mit ihnen umgehen können. Zudem bietet C# selbst keine eigene Syntax dafür, aber über Array.CreateInstance ist so einiges möglich 😉

beste Grüße
zommi

P
PaBa Themenstarter:in
7 Beiträge seit 2015
vor 8 Jahren

Vielen Dank für die Antworten. Ich hab auf Lazarus gelernt, ist ähnlich wie Delphi.

Zuerst die Frage nach dem Sinn oder Unsinn von dynamischen Array. Hier ein Beispiel: Array beginnt mit dem Jahr 1980 und endet bei 2099.

var
  Jahr: array[1980..2099] of Integer;
  i: Integer;
begin
  for i := Low(Jahr) to High(Jahr) do
   Jahr[i] := i;
end;  

Praktisch ist auch das

  b: array[Boolean] of String;    

Hier ist weniger die Definition wichtig als die Möglichkeiten die man später hat. Man kann in einem Bereich arbeiten ohne den Bereich oder die Definition zu kennen.

Wie gesagt, ich bestehe nicht drauf. Ich will nur die Unterschiede kennen lernen. Im Buch steht auch nicht alles drin. Mir ist aber auch klar, dass man alles elegant mit Klassen lösen kann.

@Coder007: "Statisch oder dynamisch hat nichts damit zu tun, ob die Arrays bei 0 oder bei einem anderen Index beginnen".

Ein dynamischer Array beginnt immer bei 0, ein statischer kann bei 0 anfangen, kann aber auch in anderem Bereich definiert werden.

C
2.121 Beiträge seit 2010
vor 8 Jahren

Wenn man statisch und dynamisch auf die Größe bezieht, kann C# in meiner Interpretation nur statische Arrays. Mir wäre nicht bekannt wie ich die Größe eines Arrays nachträglich ändern kann.

kommt man (normalerweise) kaum mit blanken Arrays in Berührung

Außer man programmiert 😄
Arrays tauchen selbst im Framework an diversen Stellen auf, daher hat man im Alltag immer wieder damit zu tun.

3.003 Beiträge seit 2006
vor 8 Jahren

Vielen Dank für die Antworten. Ich hab auf Lazarus gelernt, ist ähnlich wie Delphi.

Zuerst die Frage nach dem Sinn oder Unsinn von dynamischen Array. Hier ein Beispiel: Array beginnt mit dem Jahr 1980 und endet bei 2099.

Und da hast du auch schon den Grund, wieso "Puristen" diese Form von Array eher ablehnen. Du gibst dem Index eines Arrays, der die Aufgabe hat, ein Element des Arrays adressieren zu können, damit eine inhaltliche (weitere) Bedeutung, die dem Array später so nicht ohne weiteres anzusehen ist. Das heisst, das Arrays wird auf einmal von einem Datencontainer zu einem inhaltlichen Element, was nicht seine Aufgabe sein sollte.

Wie oben schon angedeutet, möglich wäre das durchaus, aber es wird nicht ermutigt.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
415 Beiträge seit 2007
vor 8 Jahren

Um LaTinos Beitrag noch zu ergänzen: Man würde in C#, in dem von PaBa konstruierten Beispiel, wohl eher eine Collection mit Key-Value Paaren einsetzen. Etwa einer HashTable oder einem Dictonary

A
764 Beiträge seit 2007
vor 8 Jahren

Um LaTinos Beitrag noch zu ergänzen: Man würde in C#, in dem von PaBa konstruierten Beispiel, wohl eher eine Collection mit Key-Value Paaren einsetzen. Etwa einer HashTable oder einem Dictonary

Datumseinschränkung auf Jahr ist wohl eine Auswahlbox für ein Alter. Würde man heute wohl eher mit Datumsauswahlboxen machen und die Grenzen min und max über Validation abfackeln.

W
955 Beiträge seit 2010
vor 8 Jahren

Arrays tauchen selbst im Framework an diversen Stellen auf, daher hat man im Alltag immer wieder damit zu tun. Aber so richtig toll sind sie dennoch nicht Arrays considered somewhat harmful

Um LaTinos Beitrag noch zu ergänzen: Man würde in C#, in dem von PaBa konstruierten Beispiel, wohl eher eine Collection mit Key-Value Paaren einsetzen. Etwa einer HashTable oder einem Dictonary Sicherlich das Dictionary<k,v>. Was soll man denn mit einfachen Jahreszahlen anfangen? Das wären doch eher Modellklassen wie ProduktionProJahr o.ä.

P
PaBa Themenstarter:in
7 Beiträge seit 2015
vor 8 Jahren

Ich nochmal. Leider hatte ich die letzte Woche keine Zeit, so dass ich mich mit dem Thema nicht beschäftigen konnte.

Ich denke mir C# ist eine moderne Sprache und man hat da nichts vergessen was notwendig ist. Deshalb gehe ich davon aus, dass die Probleme die ich als Probleme sehe, nicht wirklich Probleme sind, sondern sich irgendwie anders lösen lassen. Es ist aber nun mal so, dass ich mal in Lazarus Pascal ein Programm geschrieben habe, welches etliche Klassen enthält und die Klassen Arrays beinhalten. Je nach Bedarf werden die Array erweitert oder reduziert. Man kann auch sagen es sind Listen.

Nun habe ich mir überlegt dieses Programm nochmal in C# nachzuprogrammieren. Das Problem sind aber die Arrays. Wie gesagt, alles ist mit Klassen gelöst, aber in den Klassen gibt es Arrays. Einige Arrays beinhalten lediglich Daten, andere beinhalten Listen mit Objekten. Und alles ist dynamisch gelöst.

Nun meine Frage: habe ich richtig verstanden, dass einmal definiertes Array endgültig ist und nicht weiter dynamisch erweitert werden kann? Denn dann habe ich ein Problem und muss ein komplett anderen Ansatz für die Klassen suchen.

3.003 Beiträge seit 2006
vor 8 Jahren

Du hast ungefähr drölftausend Möglichkeiten, in C# eine Menge von Objekten gleicher Art zu speichern: https://msdn.microsoft.com/de-de/library/system.collections.ienumerable(v=vs.110).aspx

Arrays sind nur eine Möglichkeit, und die primitivste.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

P
PaBa Themenstarter:in
7 Beiträge seit 2015
vor 8 Jahren

LaTino, du hast Recht, allerdings muss ich hier etwas klären. Als ich mit dem Programmieren in der Schule begann, bekam ich von einem Bekannten einen Tipp. Ich soll die Klassen nicht als Black-Box ansehen, wo man Daten eingibt und Ergebnisse erhält, sondern die Quellcodes der Klassen studieren. Bei Lazarus ist das möglich. Alle Klassen und Funktionen sind zugänglich. Das habe ich auch gemacht. Fast jede Klasse die ich neu nutze studiere ich zuerst im Quellcode. Da lernt man viel über Klassenprogrammierung.

Um auf den Punkt zu kommen, auch bei Lazarus gibt es Objekt-Listen, die nichts mit Arrays zu tun haben. Aber guckt man sich den Quellcode an, steht am Anfang immer ein Array. Er bildet den Grundstock der Liste. Dieses Konzept habe ich dann auch bei meinen Klassen übernommen. Ich hätte stattdessen auch Objekt nehmen können, mir machte es aber Spaß an der Wurzel anzufangen

3.003 Beiträge seit 2006
vor 8 Jahren

@PaBa, da sitzt du einem kleinen Irrtum auf. Arrays sind nichts weiter als ein "reservierter" Speicherbereich. Das Array speichert die Startadresse im Speicher, die Größe jedes Elements, sowie die Anzahl der Elemente. So ist jederzeit unter Kontrolle, welcher Speicherbereich (von wo aus, und wie groß?) für das Array reserviert ist.

Dass Lazarus dir Arrays anbietet, die du beliebig vergrößern kannst, ist schon Syntax-Zucker: Lazarus kann auf die Anweisung hin, dass mehr Speicher benötigt wird, denselben eben auch reservieren. Wenn ich mich richtig erinnere, wird in so einem Fall nicht etwa der Speicherbereich einfach erweitert (weil nicht gesichert ist, dass da nicht schon was anderes wichtiges drin steht), sondern ein neuer in der neuen Größe reserviert, und die Elemente dorthin kopiert. Wenn man genauer drüber nachdenkt, hat man sonst auch nicht viele Möglichkeiten.

Langer Rede kurzer Sinn: auch die Arrays von Lazarus kapseln bereits mehr Funktionalität, als dir bewusst ist. Die von C# sind an Arrays in C angelehnt, und können deshalb nicht viel mehr, als eben eine feste Anzahl von Elementen fester Größe speichern. Die Arrays-Resize-Methode macht schon genau das oben beschriebene. Mit anderen Worten vergleichst du ein Konzept aus Lazarus, das sich Array nennt, mit einem Konzept aus C#, das auch so heisst. Nur machen die nicht dasselbe, weil bei Lazarus eben noch etwas Syntaxzucker oben drauf ist. Den gibt's bei C# auch, nur heisst das dann nicht Array. Wenn du etwas 1:1 abbilden willst, dann nimm Sprachelemente, die dieselbe Funktion haben, und nicht Sprachelemente, die denselben Namen haben.

LaTino
Edit: und pass auf, dass du, wenn du gerne "zur Wurzel" zurückkehrst, nicht dem NIH-Syndrom verfällst (https://en.wikipedia.org/wiki/Not_invented_here). Statt alles selber zu machen und damit potenziell Fehler reinzubringen, sollte man wirklich das nutzen, was das Framework bereitstellt. Der Kram ist getestet, (meistens) schnell und funktioniert.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

P
PaBa Themenstarter:in
7 Beiträge seit 2015
vor 8 Jahren

Hallo LaTino, danke für die Antwort. Zuerst zu der Frage nach Arrays oder Klassen. Ich bestehe nicht auf den dyn. Arrays bei C#, ich muss vielleicht erst nur die Trennung im Kopf vollziehen. Wenn ich die nötigen Klassen kenne, wird es wohl nicht das Problem sein. Ich denke ich sollte einfach Pascal vergessen und keine Vergebliche ziehen.

Was Lazarus angeht, so habe ich einen Bekannten der mir gelegentlich etwas hilft. So wie ich nun erfahren habe sind die dynamische Arrays auch nicht von Anfang an in Delphi gewesen, sondern wurden später um diese erweitert. Dass da intern nicht einfach der Speicher erweitert wird, sondern bei Bedarf umkopiert wird, das dachte ich mir schon. Trotzdem praktisch.

Und was das NIH-Syndrom angeht, mir geht es beim studieren der Klassen eher drum das Wesen der Klassen zu lernen. Man lernt viel wenn man sich solche Quellcodes anguckt.

3.003 Beiträge seit 2006
vor 8 Jahren

Was Lazarus angeht, so habe ich einen Bekannten der mir gelegentlich etwas hilft. So wie ich nun erfahren habe sind die dynamische Arrays auch nicht von Anfang an in Delphi gewesen, sondern wurden später um diese erweitert.

Ja, das hat FreePascal eingeführt. Die dynamischen Arrays sind, ich habe das am Wochenende mir nochmal angeschaut, tatsächlich genau wie von mir beschrieben. Für die C-Hasen: nicht viel mehr als 'n Zeiger.

Und was das NIH-Syndrom angeht, mir geht es beim studieren der Klassen eher drum das Wesen der Klassen zu lernen. Man lernt viel wenn man sich solche Quellcodes anguckt.

Wenn du so drauf bist, empfehle ich mal das gründliche Studium von dem hier:

https://www.microsoft.com/en-us/download/details.aspx?id=7029

Ich bin da ähnlich veranlagt, das da war mein C#-Einstieg. Ist interessanter, als man von einem Spec-Paper erwarten sollte 😉. Und erklärt ganz genau, wie bestimmte Sprachfeatures von C# funktionieren - vom Vergleich mit logischen Operatoren bis hin zur Grammatik. Wenn die MSDN der Überblick über den ganzen Wagen ist, dann ist das der Bauplan vom Motor.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)