Ich war a blog von Eric Lippert zu lesen, wo er erklärt, warum er so gut wie nie Arrays verwenden und das folgende Teil hat mich neugierig:Was nutzt AsEnumerable() für ein Array?
Wenn Sie eine solche API schreiben, wickeln Sie das Array in eine Readonlycollection und Rückkehr ein IEnumerable oder ein IList oder etwas, aber kein Array. (Und natürlich, nicht einfach das Array auf IEnumerable zu werfen und denke, du bist fertig! Das ist immer noch Variablen ausgibt; der Anrufer kann einfach zurück in Array! Nur ein Array übergeben, wenn es von einem eingewickelt ist nur-Lese-Objekt)
so wurde ich mit einer Sammlung um ein bisschen durcheinander.
string[] array = new[] { "cat", "dog", "parrot" };
IEnumerable<string> test1 = array.AsEnumerable();
string[] secondArray = (string[])test1;
//array1[0] is now also "whale"
array[0] = "whale";
//11 interfaces
var iArray = array.GetType().GetInterfaces();
//Still 11 interfaces??
var iTest1 = test1.GetType().GetInterfaces();
ich initialisieren ein Array und verwenden sie dann die AsEnumerable()
Methode auf, um es zu einem IEnumerable
zu konvertieren (oder so Ich dachte), aber wenn ich es in ein neues Array zurückgeworfen und einen Wert im ursprünglichen Array geändert habe, die Werte von test1
und secondArray
wurden geändert in. Apparently Ich habe gerade 2 neue Verweise auf das Original-Array, anstatt eine neue IEnumerable
ein bisschen wie ToArray()
gibt ein neues Array.
Wenn ich die Schnittstellen des Arrays und IEnumerable
vergleiche, haben sie beide die gleichen Schnittstellen. Warum hat Array diese Methode, wenn es überhaupt nichts tut? Ich weiß, AsEnumerable()
hat seine Verwendung mit Linq-to-Entities, um die aufzählbaren Methoden zu erhalten, wenn Sie eine IQueryable
haben, aber warum würde diese Methode zu einem Array hinzugefügt werden? Gibt es einen praktischen Nutzen für diese Methode?
Edit: Dieser Kommentar von Tim Schmelter wirft einen wirklich guten Punkt und sollte nicht unbemerkt bleiben:
„Es ist nicht so nutzlos Sie können die tatsächlichen Typ ändern, ohne den Rest des Codes zu brechen.. Sie können also das Array durch eine Datenbankabfrage oder -liste oder einen Hash-Satz oder was auch immer ersetzen, aber das AsEnumerable funktioniert immer und der Rest des Codes auch nach. Also ist das AsEnumerable wie ein Vertrag. "
vielleicht diese Ihnen helfen können: http://stackoverflow.com/questions/2013846/why-use-asenumerable-rather-than-casting-to-ienumerablet – Domysee
'Die AsEnumerable (IEnumerable ) Methode hat keinen anderen Effekt als den Kompilierungszeittyp der Quelle von einem Typ zu ändern, der IEnumerable zu IEnumerable sich selbst implementiert. https://msdn.microsoft.com/library/bb335435(v=vs.100).aspx –
Und die Implikation von Das oben genannte (was ich zitiert habe) bedeutet, dass Sie es anders durchlaufen können. Nicht sicher, was es sonst noch bietet. –