Question

J'utilise C #. J'ai créé une classe qui peut être inclus dans un projet C # .net (bureau ou sur Internet), mais je veux que seuls 10 objets seront créés dans cette application de ma classe. Si les instances d'objet créé plus de 10, alors il devrait donner une erreur simple ou ne fonctionnera pas.

Il peut y avoir deux situations,

  1. J'inclus fichier dans un myclass.cs projet ou
  2. Je vais regrouper ma classe dans une DLL et l'inclure dans toute application

Dans les deux cas, il doit, par erreur, si plus de 10 cas de ma classe est créée dans l'application.

Cette question a été posée par mon professeur, il m'a dit de chercher la réponse sur Internet, j'ai essayé, mais pas où trouver une solution à ce problème, je ne l'ai pas entendu dire que nous pouvons limiter les objets?

Est-il possible, si oui, comment?

Merci

Était-ce utile?

La solution

Gardez une variable statique avec le nombre d'instances créées. Incrémenter ce nombre à chaque construction de l'objet. Faire l'objet IDisposable et décrémenter ce numéro sur chaque appel à Dispose (). Si vous voulez qu'il soit thread-safe, utilisez Interlocked.Increment () et Interlocked.Decrement () pour modifier la valeur de cette variable au lieu de ++ et -.

Autres conseils

Vous aurez simplement besoin d'utiliser le href="http://en.wikipedia.org/wiki/Factory_pattern" avec un compteur du nombre de cas créé, après quoi la méthode d'usine lancera une exception nulle / retour.

Exemple:

public class Foobar
{
    private static int numInstances = 0;

    public static Foobar CreateFoobar()
    {
        if (numInstances++ < 10)
        {
            return new Foobar();
        }

        return null;
    }

    protected Foobar()
    {
        ...
    }
}

La méthode ci-dessus fonctionnera parfaitement pour une application unique instance, mais pour une application multi-instance, vous aurez probablement envie d'utiliser un

Je voudrais créer un statique entier et le mettre à jour lorsque vous instancier un nouvel objet.

class YourClass
{
    static int Count = 0;

    public YourClass()
    {
       Count++;
       if(Count > 10)
       {
           //throw exception
       }
    }
}

prendre un compteur statique dans la classe, et jeter une exception dans votre constructeur de classe si count> 10

Pour disposer d'exemple créer également une méthode de décharge statique (similaire à AppDomain). Avoir la mise en œuvre d'appel de la méthode de déchargement de IDisposable qui décrémente compteur à l'aide Interlocked.Decrement et également disposer de l'instance.

(Je suppose si votre limite le nombre d'instances que vous avez des ressources dans l'instance à gérer.)

Vous pouvez également utiliser les médicaments génériques pour permettre la classe d'usine à être réutilisée pour limiter les cas de différentes classes. Utilisez des contraintes d'exiger par exemple pour mettre en œuvre IDisposible et un constructeur par défaut. Fournir également une propriété non-statique pour retourner l'instance réelle.


public class foo : IDisposable 
   {
   public foo() { ; }
   public string Name;

   public void Dispose()  { ; } 
   // Real class would free up instance resources
   }

  LimitedInstance< foo > li = LimitedInstance< foo >.CreateInstance();

  li.Instance.Name = "Friendly Name for instance";
  // do stuff with li

  LimitedInstance< foo >.UnloadInstance( ref li );

Le seul problème est que vous ne pouvez pas surcharger l'opérateur d'affectation en C #. Donc, si vous procédez comme suit:


   li = null;

Au lieu d'appeler la méthode de décharge alors l'instance restera sur le tas, et votre compteur à nombre d'instances décrémentés habitude, jusqu'à ce que se produit GC.

scroll top