2016-10-20 41 views
0

Je traversais un code et viennent à travers avec indexeur et je ne suis pas en mesure de comprendre comment il fonctionne, voici mon codepas capable de comprendre indexeur en C#

public class FlyweightFactory 
    { 
     Dictionary<string, FlyweightFactory> flyweights = new Dictionary<string, FlyweightFactory>(); 
     public void display() { } 
     public FlyweightFactory this[string index] 
     { 
      get 
      { 
       if (!flyweights.ContainsKey(index)) 
        flyweights[index] = new FlyweightFactory(); 
       return flyweights[index]; 
      } 
     } 
    } 
    class Client 
    { 
     // Shared state - the images 
     static FlyweightFactory album = new FlyweightFactory(); 
     static void Main() 
     { 
      Client client = new Client(); 
      album["A"].display(); 
      Console.ReadLine(); 
     } 

    } 

dans ce code que j'ai créé un indexeur comme celui-ci

public FlyweightFactory this[string index] 
     { 
      get 
      { 
       if (!flyweights.ContainsKey(index)) 
        flyweights[index] = new FlyweightFactory(); 
       return flyweights[index]; 
      } 
     } 

mais je quand je suis en train de faire un indexeur comme celui-ci je reçois une erreur

album["A"];

mais en même temps quand je l'utilise comme cela, il fonctionne bien

album["A"].display();

s'il vous plaît me aider à comprendre le fonctionnement de l'indexeur, merci

+0

Et quel est l'erreur que vous obtenez? – Servy

+0

"Je reçois une erreur" Quelle erreur? – itsme86

+4

C'est simple: vous ne pouvez pas utiliser un indexeur (ou une propriété, ou un constructeur) comme une déclaration en soi. Vous ne pouvez pas écrire '" text ".Length;' ou 'new object();'. Mais vous pouvez utiliser 'var x =" text ".Length;' et de même vous pouvez écrire 'var factory = album [" A "];' –

Répondre

1

Vous ne pouvez pas écrire cette déclaration en C# et il émettra les éléments suivants erreur:

erreur CS0201: affectation uniquement, appel, incrément, décrément, et de nouvelles expressions d'objets peuvent être utilisés comme une déclaration

une telle déclaration ne correspond pas à l'un des catégories indiquées dans le message d'erreur.

Pour corriger l'erreur attribuer cette déclaration à une variable:

var myValue = album["A"]; 

Maintenant, pour l'indexeur:

Il vous permet d'accéder à un élément dans une collection par le biais d'une clé spécifique le type, dans un tableau que vous accédez souvent des éléments de leur indice, tels que:

int[] ints = {0, 1, 2, 3}; 
var int1 = ints[0]; // get first element 

Mais vous pouvez mettre en œuvre un autre type de int, ici j'ai utilisé un string:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 

namespace Tests 
{ 
    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      // generate some data 
      var artist = new Artist {Name = "Britney", Surname = "Spears"}; 
      var artists = new[] {artist}; 
      var collection = new ArtistCollection(artists); 

      // find an artist by its name, using the custom indexer 
      var artist1 = collection["Britney"]; 
     } 
    } 

    public class Artist 
    { 
     public string Name { get; set; } 
     public string Surname { get; set; } 
    } 

    public class ArtistCollection : Collection<Artist> 
    { 
     public ArtistCollection() 
     { 
     } 

     public ArtistCollection(IList<Artist> list) : base(list) 
     { 
     } 

     /// <summary> 
     ///  Gets an artist by name. 
     /// </summary> 
     /// <param name="name"></param> 
     /// <returns></returns> 
     public Artist this[string name] 
     { 
      get 
      { 
       if (name == null) 
        throw new ArgumentNullException(nameof(name)); 
       var artist = this.SingleOrDefault(s => s.Name == name); 
       return artist; 
      } 
     } 
    } 
} 
+0

je dois admettre que c'était une telle question de vidage et je luttais dessus pendant plus de 4 heures, peut être son temps pour café, merci pour votre aide :) –

+0

mais encore j'ai une question et laissez-moi le mettre à jour pour vous –

+1

En fait, il est fortement conseillé que vous postez ** une autre ** question si elle est hors de la portée de l'actuel, en StackOverflow :) – Aybe