Question

public class Sample
{
     static int count = 0;
     public int abc;
     public Sample()
     {
        abc = ++Sample.count;
     }
}

Je veux créer un tableau de classe ci-dessus, et que vous voulez chaque élément du tableau à initialiser en appelant le constructeur par défaut, de sorte que chaque élément peut avoir différents abc.So Je l'ai fait:

Sample[] samples = new Sample[100];

Mais cela ne fait pas ce que je pense qu'il devrait faire. Il semble que cette façon le constructeur par défaut n'est pas appelé. Comment appeler le constructeur par défaut lors de la création d'un tableau?

je voudrais aussi savoir qu'est-ce que la déclaration ci-dessus fait?

Était-ce utile?

La solution

Vous ne pouvez pas, au fond. Lorsque vous créez un tableau, il est toujours en premier lieu avec la valeur par défaut pour le type - qui, pour une classe est toujours une référence null. Pour int il est 0, pour bool il est faux, etc.

(Si vous utilisez un initialiseur de tableau, qui va créer le tableau « vide » et puis le remplir avec les valeurs que vous avez spécifié, bien sûr.)

Il existe différentes façons de peupler le tableau en appelant le constructeur - je probablement il suffit d'utiliser moi-même boucle foreach. LINQ avec Enumerable.Range / répétition se sent un peu forcé.

Bien sûr, vous pouvez toujours write votre propre méthode de la population, comme une méthode d'extension:

public static T[] Populate<T>(this T[] array, Func<T> provider)
{
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = provider();
    }
    return array;
}

Ensuite, vous pouvez utiliser:

Sample[] samples = new Sample[100].Populate(() => new Sample());

Ce que je aime cette solution:

  • Il est encore une seule expression, qui peut être utile dans divers scénarios
  • Il ne présente pas les concepts que vous ne voulez pas vraiment (comme la répétition d'une seule valeur ou la création d'une gamme)

Bien sûr, vous pouvez ajouter plus d'options:

  • Une surcharge qui prend Func<int, T> au lieu d'un Func<T>, en passant l'index du fournisseur
  • Une méthode non-extension qui crée le tableau et Remplit it

Autres conseils

Votre code ne crée que le tableau , mais aucun de ses éléments. En gros, vous devez instances de magasin de Sample dans ce tableau.

Pour faire simple, sans fantaisie LINQ etc.

Sample[] samples = new Sample[100];
for (int i = 0; i < samples.Length; i++) samples[i] = new Sample();

S'il vous plaît noter également votre solution est pas thread-safe.

Il n'y a aucun moyen de le faire automatiquement; initialisation de la matrice est essentiellement « effacer ce bloc de mémoire à 0s ». Vous auriez à faire quelque chose comme:

var arr = new SomeType[size];
for(int i = 0 ; i < size ; i++) arr[i] = new SomeType();

À ce stade, vous avez un tableau vide de la taille 100, si vous voulez le remplir avec des articles, alors vous devez faire quelque chose comme:

for(int i=0; i<samples.Length; i++) {
   samples[i] = new Sample();
}

Le problème est que, en déclarant ce tableau, vous ne l'espace alloué pour chaque objet. Vous simplement l'espace alloué pour 100 objets de type échantillon. Vous devez appeler le constructeur sur vous-même chacun.

Pour élaborer:

Food[] foods = Food[100];
for (int k = 0; k < foods.length; k++) {
   foods[k] = new Food();
}

Un travail intéressant autour de peut-être une fonction usine. Pensez à attacher ceci à votre classe Sample.

public static Sample[] getInstances(int aNumber) {
    Sample[] sample = Sample[aNumber];
    for (int k = 0; k < sample.length; k++) {
       sample[k] = new Sample();
    }

    return sample;
}

Hides la tache, un peu -. Fournit c'est une fonction utile pour vous

Voici un autre en une ligne qui ne nécessite pas de méthode d'extension:

Sample[] array = Enumerable.Range(0, 100).Select(i => new Sample()).ToArray();

Une autre option intéressante est la suggestion de Scott réponse de Jon :

public static T[] Populate<T>(this T[] array) 
    where T : new()
{
    for (int i = 0; i < array.Length; i++)
        array[i] = new T();
    return array;
}

Vous pouvez faire:

Sample[] array = new Sample[100].Populate();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top