C# Verständnis Frage: Typen und Arrays
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
array
beispiel
brauchen
code
container
dank
datenbank
datum
einlesen
klasse
list
set
sprache
string
struktur
tabelle
typ
type
umwandlung
verwenden
-
Moin,
als alter PHP Hase wollte ich nun mal C# anfangen und versuche im Moment diese ganze Sache mit den restriktiven Variablen zu verstehen. Um genauer zu sein, restriktiven Arrays (int[] myArr = new int[x];).
Bis jetzt habe ich es so verstanden, dass ein Array einen Typ zugewiesen bekommt und dann nur diesen Typ halten kann. Sprich ich kann jetzt nicht beigehen und einen String oder Bool ins Array schmeißen, wie ich es aus PHP kenne. Wie kann ich jetzt, zum Beispiel, eine Tabelle aus einer Datenbank einlesen und als Array initialisieren, was verschiedene Datentypen enthält?
Weil wenn ich das soweit richtig verstanden habe, müsste ich dann die Daten als Strings initialisieren und dann bei Verwendung entsprechend konvertieren? Aber das geht ja auch nicht wirklich immer gut... soweit ich weiß kann man String nicht zu Bool konvertieren, oder?#
Wäre nett wenn mich da jemand aufklären kann :D
EDIT: ggf. schlecht gewählter Titel...
Beitrag zuletzt geändert: 19.9.2011 11:25:07 von strange -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Bis jetzt habe ich es so verstanden, dass ein Array einen Typ zugewiesen bekommt und dann nur diesen Typ halten kann.
Das statische Array ist keine extra Klasse sondern einfach ein Array of Type. Aber natürlich gibt es auch extra Array Klassen im .Net-Framework wie List<>.
Übrigens: Es gibt auch nicht generische Arrays (Generics sind erst später eingeführt worden)
Wie kann ich jetzt, zum Beispiel, eine Tabelle aus einer Datenbank einlesen und als Array initialisieren, was verschiedene Datentypen enthält?
Das .Net-Framework bietet genügend Wrapper, die dir die Arbeit eigl. schon abnehmen sollten, sprich du arbeitest nur noch mit dem Entity-Manager und den Entities.
Empfehlenswert ist das Entity Framework, da es eigl. jede gängige Datenbank unterstützt.
Beitrag zuletzt geändert: 19.9.2011 14:54:32 von spuglisi -
Danke erst einmal für die Info... das mit der Datenbank habe ich nur mal ein Beispiel genommen, da dies für mich dann ein wenig einfacher zu verstehen ist, da ich halt aus der PHP-Ecke komme und man dort halt Arrays mit dem vollpacken kann, was man will und man ist halt nicht nur auf Int oder andere Typen beschränkt.
Mir geht es hauptsächlich darum, ob es eine Möglichkeit gibt dies auf C# zu übersetzen:
$array = array('string1', true, 25, 'string2'), 42;
(string / bool / int / string)
Und laut Klassenbeschreibung ist auch List<> Typ-gebunden: [KlickMich]
Aber danke schon mal für den Tipp mit dem Wrapper, den werde ich demnächst wohl brauchen :D -
Jep, da hast du auch recht. C# ist eine typsichere Sprache. Aber es besteht auch die Möglichkeit in einem Array Objekte unterschiedlicher Typen zu haben:
object[] container = new object[3]; container[0] = 5; container[1] = "String"; container[2] = 3.14; int i = container[0] as int; string str = container[1] as string;
Beitrag zuletzt geändert: 19.9.2011 16:43:28 von spuglisi -
Ok, das bestätigt meine Vermutung, das ich den "Umweg" über Umwandlungen nehmen muss. Aber danke ;)
-
Hallo strange,
einen Umweg über Casts/Umwandlungen musst Du eigentlich nicht gehen.
Du musst Dir ganz einfach folgende Frage stellen:
Warum willst Du unterschiedliche Datentypen in einem Array speichern?
Die Antwort auf die Frage lautet normalerweise:
Weil die Daten in einem Zusammenhang stehen bzw. zusammengehören!
Wenn Daten zusammengehören, dann kann man sie ganz einfach in einer Klasse oder Struktur zusammenfassen. Das geht im Übrigen auch in PHP.
Hier mal ein Beispiel:
Die Klasse bzw. Struktur:
public class MeaningfulData1 { public string Name {get; set;} public int Age{get; set;} public bool HasCar{get; set;} public MeaningfulData1(string Name = "", int Age = 0, bool HasCar = false) { this.Name = Name; this.Age = Age; this.HasCar = HasCar; } } public struct MeaningfulData2 { public string Name {get; set;} public int Age{get; set;} public bool HasCar{get; set;} public MeaningfulData2(string Name = "", int Age = 0, bool HasCar = false) { this = new MeaningfulData2(); this.Name = Name; this.Age = Age; this.HasCar = HasCar; } }
Die zugehörigen Arrays:
Es gibt einige unterschiede zwischen Klassen und Strukturen. Klassen werden im Allgemeinen als Referenzen behandelt. Daher muss auch jedes Feld in einem Array erst einmal mit einem neuen Objekt belegt werden bevor man es verwenden kann. Strukturen werden wie normale Werte behandelt, wehalb man die Felder des Arrays sofort verwenden kann.MeaningfulData1[] arr1 = new MeaningfulData1[10]; arr1[0] = new MeaningfulData1(); arr1[0].Name = "Hans"; arr1[0].Age = 53; arr1[0].HasCar = true; arr1[1] = new MeaningfulData1("Joseph", 14); MeaningfulData2[] arr2 = new MeaningfulData2[10]; arr2[0].Name = "Hans"; arr2[0].Age = 53; arr2[0].HasCar = true; arr2[1] = new MeaningfulData2("Joseph", 14);
Desweiteren ist es auch etwas komplizierter eine Konstruktor für Strukturen zu schreiben wenn die Struktur automatisch erzeugte Felder beinhaltet. Oben ist ein funktionierendes Beispiel.
Auf jedenfall hast Du damit den Vorteil, dass Du Dir nicht merken musst, welcher Index was bedeutet, da auf diese Weise alles einen Namen hat und der Code damit auch besser lesbar/wartbar ist.
-
Danke für die sehr ausführliche Beschreibung, bin mittlerweile auf die selbe Idee gekommen und beiße mir jetzt sogar in den Arsch, weil ich da noch nicht früher drauf gekommen bin. Bin wohl zu sehr in meine extrem verschachtelten Arrays in PHP verliebt :P
Werde mir wohl angewöhnen müssen Arrays nur noch dann einzusetzen wenn ich sie wirklich brauche... -
Hmm. Auch wenn es in Sprachen wie C# kein guter Stil ist alles ohne Zusammenhang in einen Array reinzuschmeißen ist es dennoch seit dem .NET 4 Framework möglich. Das Stichwort heißt dynamic. Hier ein kleines Beispiel
class Program { static void Main( string[] args ) { var array = new { Name = "Peter", Age = 32 }; List<dynamic> list = new List<dynamic>(); list.Add( array ); list.Add( 4 ); list.Add( "Vier" ); doSomething( list[1] ); Console.ReadLine(); } static void doSomething(int arg) { Console.WriteLine( 3 + arg ); // Ausgabe ist 7 } }
Das Schlüsselwort 'dynamic' bewirkt, dass erst zur Laufzeit der Type geprüft wird. Das hat natürlich auch den Nachteil, dass mehr Fehler erst zu Laufzeit bemerkbar werden. Wie gesagt, in C# wird man davon eigl. so gut wie nie gebrauch machen (wohl nur in den seltensten Fällen), da normalerweise alle Array-Items gleiche Eigenschaften aufweisen (zB. implementieren sie das gleiche Interface oder erben von einer gemeinsamen Klasse (nicht unbedingt direkt), aber wenn du es doch mal brauchen solltest, weißt du es ja jetzt :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage