Die übergabe-Liste<Klasse> als argument, C#, mithilfe von "ref" - Schlüsselwort
Freunde!
Also ich Schreibe ein einfaches Programm. Im Grunde genommen habe ich eine Klasse (3 Streicher, 1 int, einige Methoden). Ich bin initialisieren der Werte von Objekten dieser Klasse aus einer text-Datei. Ich bin mit der Liste für dieses.
Das problem ist, dass die Initialisierung ist eine separate Funktion. Ich hatte die Liste SOWOHL deklariert UND initialisiert, in dieser Funktion. Aber ich könnte es brauchen in anderen Funktionen, einschließlich " - Programm.Main".
Sollte ich eine "Globale" Klasse und einem public List< Klasse > ? Beschloss ich, einfach zu erklären, es in mein Programm.Main-Funktion wie jetzt. Allerdings bin ich mir nicht sicher, ob eine Liste übergeben, by value oder by-reference. Ich fand eine Seite im Internet, die vermuten lässt, mit ref - Schlüsselwort. Nun habe ich:
public Class FooClass
{...}
class Program
{
static void Main(string[] args)
{
List<FooClass> fooDB = new List<FooClass>;
initFromFile(ref fooDB);
}
private static initFromFile(ref List<FooClass> fooDB)
{
using (StreamReader ... )
{
while( ... )
{
...
fooDB.Add(new FooClass(args))
}
}
}//initFromFile
}//Program
Soll ich so weitermachen wie dieser? Oder gibt es irgendwelche entscheidenden Anregungen? Vielleicht ist "ref", ist nicht eine gute Praxis auf allen?
TLDR: Sollte ich eine Globale Liste oder übergeben Sie es als Referenz oder auf andere Weise(vorschlagen). Wenn durch Verweis übergeben wird, dann soll ich eine ref - Schlüsselwort oder gibt es einen anderen Weg?
Vielen Dank im Voraus,
~~~hlfrmn
- Was auch immer Seite, die Sie gefunden, dass ist völlig falsch und sollte ignoriert werden.
- Warum sind Sie sogar mit
ref
es gibt keinen Grund, aus dem code, den Sie gezeigt. Würden Sie nur benötigen, um einref
wenn Sie hattefooDB = Somthing;
in IhreminitFromFile
Funktion. - yoda.arachsys.com/csharp/parameters.html
- D Stanley ' s Antwort ist richtig und ich möchte nur hinzufügen, dass zu beantworten, den anderen Teil deiner Frage, Nein, Sie sollten nicht in einer globalen Liste. c2.com/cgi/wiki?GlobalVariablesAreBad
- Es ist einfach nur dumm mich. Schnell gegoogelt "c# - pass-argument by reference", sah "ref" und nur der Eingabe sofort. Der Artikel hatte nur Beispiele mit INT.
- Ja, ich wusste wirklich nicht wollen, um einen globalen, das ist vor allem, warum ich fragte, ob die "in-Main-Erklärung" war in Ordnung. Danke für den link.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Art, wie Ihr Programm aufgebaut ist, ist nur in Ordnung, außer es gibt keine Notwendigkeit, toi Verwendung
ref
.List<T>
ist ein Referenz Typ, was bedeutet, dass die Wert, die an die Funktion übergeben wird, ist tatsächlich eine Referenz ("Zeiger" in C/C++ - Bedingungen), um eineList<T>
Instanz. So werden änderungen an der Liste innerhalb der Methode zur Verfügung steht, wenn die Funktion zurückgibt.Der einzige Grund, warum Sie verwenden würde
ref
ist-wenn man wollte-zu-Punkt -fooDB
zu einem neuen Instanz:BEARBEITEN
Lesen Sie den ersten Teil Ihrer Frage näher, wie es scheint
fooDB
sollte eventuell ein Klasse initialisiert wird:ref
, die Sie verwenden würdenout
. 🙂out
wäre eher angebracht.Program
mehr angemessen ist. Dann kann es verwendet werden, durch irgendeine Methode innerhalbProgram
.Generische Listen sind
reference types
daher brauchen Sie nicht zu verwendenref
Schlüsselwort.Wenn Sie eine änderung in Ihrer Liste auf Ihrer Methode, es wird sich auf Ihrer aktuellen Liste.Es sei denn, Sie versuchen, den Wert von
fooDB
direkt in dieinitFromFile
Funktion, die Sie nicht brauchen, um es zu übergeben alsref
parameter. Beachten Sie, dass Klassen in .NETTO sind Referenz-Typen, so dass, wenn Sie übergeben Sie die Liste der Methode, die parameter der Methode bezieht sich auf die gleiche Instanz, die übergeben wurde (im Gegensatz zu Wert-Typen).ref
- Parameter werden verwendet, um zu ändern, was Wert, den sowohl die parameter und die Variablen, die übergeben wurde in der Methode verweisen. Mitref
Parameter ist fast nie notwendig, typisch .NET Entwicklung.Gebe es in der Regel, und es wird funktionieren:
Gegeben, die code-Beispiel oben, würde ich vorschlagen, dass Ihr initFromFile () - Methode einfach nur wieder die Liste, d.h.
List<T>
ist ein Referenz-Typ. Der Wert IhrerfooDB
variable nicht eine Liste - es ist eine Referenz.