Hallo,
ich habe bisher noch nichts in c# gemacht, sondern nur in c++ bzw c und bin an meine Klasse so rangegangen, wie ich in C++ rangegangen bin.
class Users
{
private int nr_reg_mail;
private string* reg_mail;
/// Hier kommt der Fehler: Zeiger und Puffer fester Größe können nur in einem unsicheren Kontext verwendet werden
Users()
{
reg_mail = null;
nr_reg_mail = 0;
}
private void add_mail(string mail)
{
nr_reg_mail++;
reg_mail = new string[nr_reg_mail];
mail.CopyTo(reg_mail[(nr_reg_mail - 1)]);
}
....weitere Methoden
}
Ich will also ein Array von Strings, dass jeweils erweitert wird, sobald ich eine neue Mailadresse hinzufügen möchte.
Wie kann ich das in C# erreichen?
Vielen Dank,
Prozac
Dafür gibt es mehrere Möglichkeiten, ich würde aber sehr die Verwendung von generischen Listen empfehlen.
List<string> StringList = new List<string>();
// in deiner methode
StringList.Add("DeinString");
Gruß
DCoder
P.S.: Für solche Sachen empfielt sich auch immer ein Blick in das Galileo OpenBook zu C# http://www.galileocomputing.de/openbook/visual_csharp/ - kann ich nur wärmstens empfehlen, da viele Grundlagen bzw. praktische Anwendungen gut erklärt werden!
P.P.S.: Um mit List<T> arbeiten zu können musst du den Namespace System.Collections.Generic einbinden!
😁 P.P.P.S.: Bitte Code Tags verwenden 🙂
Warum die generische Liste? Ich würde einfach ne StringCollection nehmen. Zu finden im Namespace System.Collections.Specialized
Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.
ich denke am besten eignet sich ein arraylist das im namespace system.collections zu finden ist.
in diesem kannst du beliebig viele objekte(auch strings) hinzufügen und dynamisch löschen.
zudem kann man es mit integrierten methoden sortieren, durschsuchen, an besimmten stellen hintufügen, usw usw.. das ganze ist recht umfangreich. und wenn du ausschließlich strings reinlädst ist die verwendung umso einfacher --> beim auslesen einfach nur .tostring()
die sache mit den pointern den du in deinem code versuchst kannst du nur mit dem schlüsselwort "unsafe" erreichen aber das ist usicher und bezüglich garbagecollector absolut nicht zu empfehlen (nur gut um andere anwendungen ein wenig zu seinen gunsten zu beeinflussen ^^)
richitge pointer gibt es wie in c++ oder c nicht mehr in c# (um ehrlich zu sein braucht man die auch nciht mehr da c# alle gängigen eventualitäten bereithält)
umgang mit arraylist:
ArrayList arr = new ArrayList();
arr.Add("hallo");
arr.AddRange(stringarray_variable);
foreach(object o in arr)
{
if(o.ToString().ToUpper() == "HALLO") return;
}
nur mal als kleines beispiel...
dannn gibt es noch sort(), remove(), ... schau mal in der intellisence
Hallo JAck30lena,
also ne ArrayList halte ich nicht für besonders optimal. Wenn man mit C# anfängt und man von der Generics-Syntax verwirrt wird, dann hat sie evtl. eine Berechtigung. Sonst bin ich der Meinung, dass man (unter .NET2.0) möglichst selten die gute alte ArrayList benutzen sollte.
Eine generische Liste hat zum einen der Vorteil, dass sie typsicher ist (d.h. der Compiler meckert, wenn Du etwas anderes als den erwarteten Typ hinzufügen willst) und zum anderen muss keine Konvertierung vorgenommen werden.
Und wenns schnell gehen soll und trotzdem typsicher sein muss, dann - wie gesagt - bei Strings die StringCollection verwenden. Die hat allerdings keine sort-Methode.
Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.
Mmh, von der Performance existiert zwischen StringCollection und List<String> kein wirklicher unterschied...
Hallo,
danke für die Antworten.
Ich habe mein Vorhaben zunächst mir einer ArrayList umgesetzt. Zu generischen Listen habe ich nicht wirklich was gefunden. Ist vielleicht nicht die Ideale Variante, aber es funktioniert immerhin.
Prozac
Solange du nur Referenztypen verwendest, kannst du auch eine ArrayList verwenden.
Ich hab neulich mal einen Performance Test bezüglich ArrayList und List<T> gemacht (mit Int32 Werten) -- List<int> war bis zu 10 mal schneller!
ArrayList ist alleine schon aus Gründen der Typensicherheit abzulehnen -- als Lernstütze allerdings sicherlich anwendbar.
In dem Moment wo man sich mit generischen Listen auskennt und z.B. nicht StringCollection als Typ direkt benutzt ist die Array Frage halt gleich für jegliche Typen geklärt - mal abgesehen davon, dass ich ein List<T> nicht sonderlich verwirrend finde 😉
Aber StringCollection geht natürlich genauso - kein Frage, find es halt nur sinnvoller gleich den Umgang mit den generischen Listen zu erlernen, da man immer wieder auf solche Szenarien trifft.
Gruß
DCoder
Int32 ist auch ziemlich ungeeignet zum vergleichen, da eine Wertetyp bei der Arraylist zunächst geboxt werden muss, was auch wiederum Zeit kostet. Dennoch kann ich mich dem Ratschlag die generischen Collections zu bevorzugen nur anschließen!
Guter Einwand, habe den Performance Test auch mal mit strings und komplexen Typen gemacht -- die Listen sind entweder gleichwertig oder schneller, von daher... 😉