2016-04-15 14 views
2

Ich verstehe die ersten beiden Aussagen. Wie auch immer, für die dritte Aussage konnte ich nicht herausfinden, um welche Art von Leuten es sich handelt. IEnumerable (Person) oder List (Person)? Ich nehme an, es gibt eine Konvertierung hinter die Kulissen. Kann jemand erklären, welche Techniken in Statement 3 verwendet werden?C# -Syntax: ----- IEnumerable <Person> people = new Liste <Person>();

  1. IEnumerable (Person) Personen = neu IEnumerable (Person)();
  2. Liste (Person) Personen = neue Liste (Person)();
  3. IEnumerable (Person) people = neue Liste (Person)();
+0

Hier ist ein Vergleich auf Sammlungstypen, nur für zusätzliche Informationen zu Gießen: http://www.codeproject.com/Articles/832189/List-vs-IEnumerable-vs-IQueryable-vs-ICollection-v – Sami

Antwort

10
IEnumerable<Person> people = new IEnumerable<Person>(); 

ist ungültig. IEnumerable ist eine Schnittstelle, es kann nicht instanziiert werden.

die zweiten zwei sind gültig:

List<Person> people = new List<Person>(); 
IEnumerable<Person> people = new List<Person>(); 

Das zweite Beispiel in den obigen einfach ist, die Sammlung zu IEnumerable<Person> Gießen. Dies bedeutet, dass die Funktionalität Listnicht verfügbar bereitstellt, sofern Sie die Sammlung nicht zurück in eine Liste übertragen. Kurz gesagt, das ist nicht wirklich nützlich. Casting zu IEnumerable ist nützlich, wenn ein Verfahren definiert, wie zum Beispiel:

void DoSomethingWithPeople(IEnumerable<Person> people) 
{ 
    foreach(var person in people) 
     Console.WriteLine(person.Name); 
} 

Hier sind wir egal, ob die Auflistung eine Liste, ein Satz, eine verknüpfte Liste, usw. Alles, was wir über Pflege ist die Tatsache, dass people kann aufgezählt werden (das heißt, es ist aufzählbar).

-3

Dies bringt Ihre Person Objekt in eine neue Liste in der Klasse Person.

-1

Dies sind die Grundlagen der objektorientierten Programmierung.

IEnumerable ist eine Schnittstelle. Es definiert Methoden, ohne sie zu implementieren.

Liste ist eine Klasse und implementiert IEnumerable. Dies bedeutet, dass es die Implementierung für die Interface-Methoden bereitstellt. Sie können mehrere Implementierungen einer Schnittstelle haben.

Ihre zweite Anweisung wird sowieso nicht funktionieren, weil Sie keine Instanz (ein Objekt) einer Schnittstelle, nur einer konkreten Klasse erstellen können.

Bitte lesen Sie einige grundlegende Bücher oder Tutorials über Schnittstellen und oop im Allgemeinen

0

Sie wirklich brauchen zwischen dem Typ der Referenz und der tatsächliche Art des Objekts zu unterscheiden.Werfen Sie einen Blick auf diese:

Echt Verwendung Fall, wenn Sie wirkliche Notwendigkeit, etwas zu verarbeiten basiert nur auf der number of feet der Tiere, dann können Sie Animal Verweise auf eine Methode übergeben Tier als Argument nehmen, während das reale Objekt ist Animal myDogAsAnimal = new Dog(); oder Animal myOstrichAsAnimal = new Ostrich(); Sie können jedoch keinen Zugriff auf die Eigenschaften und Methoden von Dog und Ostrich ohne (myOstrichAsAnimal as Ostrich).BuryHeadInGround();

class Program 
{ 
    static void Main(string[] args) 
    { 
     int convertingChartToInt = 'A'; // Valid - Covert Chart to int and store it in this variable. 
     int covertDecimalToString = 5.0m; // Invalid - Convert Decimal to String and Store it in this variable. 
     ICollection<String> covertListToICollection = new List<string>(); // Valid List<T> Implements ICollection<T> 

     List<Animal> animals = new List<Animal>(); 
     List<Dog> myDogs = new List<Dog>(); 

     Animal myOstrichAsAnimal = new Ostrich(); 
     Animal myDogAsAnimal = new Dog(); 
     Dog myDogAsDog = new Dog(); 

     myOstrichAsAnimal.BuryHeadInGround(); // Will not Compile 
     (myOstrichAsAnimal as Ostrich).BuryHeadInGround(); // Will Compile 

     myDogAsAnimal.Bark(); // Will Not Compile 
     myDogAsDog.Bark(); // Will Compile 

     AdapotAnimal(myOstrichAsAnimal); // Will Compile 

     animals.Add(myOstrichAsAnimal); // Will Compile 
     animals.Add(myDogAsAnimal); // Will Compile 
     animals.Add(myDogAsDog); // Will Compile 

     FeedAnimals(animals); // Will Compile 
    } 

    private static void AdapotAnimal(Animal animal) 
    { 

    } 

    private static void FeedAnimals(List<Animal> animals) 
    { 

    } 
} 

public class Animal 
{ 
    public int NumberOfFeet { set; get; } 
} 

public class Ostrich : Animal 
{ 
    public void BuryHeadInGround() 
    { 

    } 
} 

public class Dog : Animal 
{ 
    public void Bark() 
    { 

    } 
} 
Verwandte Themen