En évitant les variables statiques avec Singleton
Un de mes collègues m'a dit que je devrais ne jamais utiliser de variables statiques parce que si vous changer en un seul endroit, ils sont changés partout. Il m'a dit qu'au lieu d'utiliser des variables statiques, je devrais utiliser un Singleton).
Je sais que Singleton est pour limiter le nombre d'instances d'une classe à une.
Comment peut-Singleton m'aider avec des variables statiques?
C'est le point des champs statiques. Aussi, singetons champs statiques (mais en lecture seule). Votre ami sonne faux.
Quand quelqu'un dit "jamais" ou "toujours", ils sont généralement mal, surtout lors de la référence à une caractéristique de la langue elle-même.
Je serais curieux de savoir comment votre collègue entend mettre en place le pattern singleton sans à l'aide d'un champ statique.
Je pense que votre collègue vous guider pour faire de propriétés ou de champs statiques dans les champs ou les propriétés d'une classe, et puis la tenue d'un singleton instance de cette classe. Si ces champs/propriétés elles-mêmes ne sont pas statiques, mais l'exemple est un singleton, qui, par nature, ancré dans un champ statique à la source. Mais sans vous montrer le code à un problème réel ou sans avoir votre collègue ici, nous ne pouvons pas dire avec certitude ce que les deux d'entre vous sont en train de parler.
Mais gardez à l'esprit, si vous modifiez les champs statiques/propriétés ou les champs/propriétés d'une instance unique, quelque chose qui ne voit que l'instance du singleton permettra également de voir les modifications. Les deux approches sont l'état global. Si observe les mutations sont ce que votre collègue veut éviter, alors que ni l'approche s'applique.
Quand quelqu'un dit "jamais" ou "toujours", ils sont généralement mal, surtout lors de la référence à une caractéristique de la langue elle-même.
Je serais curieux de savoir comment votre collègue entend mettre en place le pattern singleton sans à l'aide d'un champ statique.
Je pense que votre collègue vous guider pour faire de propriétés ou de champs statiques dans les champs ou les propriétés d'une classe, et puis la tenue d'un singleton instance de cette classe. Si ces champs/propriétés elles-mêmes ne sont pas statiques, mais l'exemple est un singleton, qui, par nature, ancré dans un champ statique à la source. Mais sans vous montrer le code à un problème réel ou sans avoir votre collègue ici, nous ne pouvons pas dire avec certitude ce que les deux d'entre vous sont en train de parler.
Mais gardez à l'esprit, si vous modifiez les champs statiques/propriétés ou les champs/propriétés d'une instance unique, quelque chose qui ne voit que l'instance du singleton permettra également de voir les modifications. Les deux approches sont l'état global. Si observe les mutations sont ce que votre collègue veut éviter, alors que ni l'approche s'applique.
OriginalL'auteur petko_stankoski | 2011-11-01
Vous devez vous connecter pour publier un commentaire.
Une manière d'utiliser un singleton (levée de http://msdn.microsoft.com/en-us/library/ff650316.aspx)
Puis,
Noter que le membre de l'instance est un champ statique. Vous ne pouvez pas mettre en œuvre un singleton sans l'aide d'une variable statique, et (me semble - il a été un certain temps) cette instance sera partagé entre toutes les demandes. À cause de cela, il est intrinsèquement pas thread-safe.
Au lieu de cela, envisager de placer ces valeurs dans une base de données ou d'autres persistante magasin c'est de fil en plus de l'environnement, et la création d'une classe qui s'interface avec la partie de votre base de données pour fournir un accès transparent.
instance
variable avec un initialiseur statique:private static readonly Singleton instance = new Singleton()
? Ensuite, votre propriété peut simplement être:public static Instance => instance;
. La seule différence est queinstance
est attribué la première fois leSingleton
classe est utilisée dans aucun capacité, pas la première foisInstance
est accessible. C'est un détail mineur, comme tous les problèmes que cela pose peut être éliminé en déplaçant le code de sa propre classe de sorte que tout l'accès à la classe ne se produit que lorsque le singleton peut être instancié.J'ai juste confirmé que les initialiseurs statiques sont garantie pour exécuter une seule fois par le domaine de l'application (attention à l'électricité statique génériques même si, comme c'est une fois par type générique). Donc, en utilisant une méthode statique au lieu d'un initialiseur statique ou statique constructeur n'est pas une bonne idée car il apporte avec lui le non thread-safe problèmes que vous mentionnez.
Yup, j'ai remarqué. Alors maintenant, mon commentaire aide à tous ces gens qui viennent à cette question à la recherche pour le courant de réponses, au lieu de les laisser dans le obsolète/archaïque terre d'essayer d'utiliser l'ancien code nouveau cadres de! C'est un gagnant tout autour, droit? Je n'ai pas voter vous. C'était une bonne information pour le moment.
Si vous voulez, je vais le supprimer et de le remanier pour éviter de dire "pas une bonne idée" et peut dire à la place "il y a maintenant une meilleure façon d'éviter thread questions de sécurité".
OriginalL'auteur 3Dave
Le point de l'ensemble de la
static
modificateur est de s'assurer que l'objet ainsi modifié, est la même partout où il est utilisé comme il ne nécessite pas d'instanciation. Le nom d'origine est une variable statique a un emplacement fixe dans la mémoire et tous les éléments se référant à elle référence au même emplacement de mémoire.Maintenant, vous pouvez utiliser un champ statique dans une classe, auquel cas il existe avant de la classe est instanciée (construits). Il peut y avoir des cas où vous voudriez que cette.
D'un singleton est une bête différente. C'est une classe qui est limitée à une seule instanciation par l'utilisation d'un constructeur privé et un
static
de la propriété. Donc, à cet égard, vous ne pouvez pas toujours éviter la statique à l'aide d'un singleton.Où puis-je dire qu'il existe avant une classe est créée?
Vous dites qu'il existe “avant la classe est instanciée (construits)”. Je pense que c'est déroutant. Les Classes ne sont pas instanciés, les objets qui sont une instance de la classe.
Mes excuses, je pensais qu'en disant "(construits)" après avoir instancié que je l'avais fait clair qu'un champ statique existe devant une classe constructeur est exécuté.
Et c'est déroutant de nouveau. Qu'est ce qu'un “constructeur de la classe”? Il pourrait être interprété comme statique constructeur d'instance ou de constructeur. Même si, vous avez raison dans les deux cas.
OriginalL'auteur ChrisBD
Laisser l'adresse de vos déclarations à la fois:
Il semble assez clair que votre collègue signifie que la caractéristique fondamentale de la statique des variables: il y a seulement un instance d'une variable statique. N'importe comment beaucoup de cas de toute la classe que vous créez, tout accès à une variable statique est à la même variable. Il n'y a pas une variable distincte pour chaque instance.
Ce n'est pas bon mondiale conseils. Les variables statiques et les singletons ne sont pas en compétition les uns avec les autres et ne sont pas vraiment substituts les uns des autres. Un singleton est une instance d'une classe, géré de telle manière qu'une seule instance est possible de créer. Une variable statique est de même lié à un seul (statique) instance d'une classe, mais peut être attribué non seulement d'une instance de classe, mais tout type de données comme un scalaire. En réalité, à utiliser efficacement le pattern singleton, vous doit de le stocker dans une variable statique. Il n'y a pas de façon "d'utiliser un singleton au lieu d'une variable statique".
Sur l'autre main, peut-être qu'il voulait dire quelque chose de légèrement différent: peut-être qu'il essayait de dire qu'au lieu de votre classe statique avoir beaucoup de différentes variables statiques, la méthode, les propriétés et les champs (au total, membres) qui fonctionnent comme si elles étaient une classe, vous devez faire ces champs non statique, et d'exposer l'emballage de la classe comme une instance du Singleton. Vous auriez encore besoin d'un privé statique champ avec une méthode ou une propriété (ou peut-être juste utiliser une seule propriété) pour exposer le singleton.
Une classe statique des variables et un singleton sont semblables en ce qu'ils sont à être instanciée qu'une seule fois (l'ancien appliquées par le compilateur et le dernier appliquées par votre mise en œuvre). La raison pour laquelle vous voulez utiliser un singleton au lieu d'une variable statique à l'intérieur d'une classe, c'est quand votre singleton doit être un vrai instance d'une classe, et consiste pas simplement de la collecte des membres statiques d'une classe statique. Ce singleton puis sera affectée à une variable statique de sorte que tous les appelants peuvent acquérir un exemplaire de cette même instance. Comme je l'ai dit ci-dessus, vous pouvez convertir tous les différents membres statiques de votre classe statique pour être membres de l'instance de votre nouveau non-statique de la classe qui vous permettra d'exposer comme un singleton.
Je tiens également à mentionner que les autres réponses données jusqu'à présent ont toutes les questions autour de la sécurité des threads. Ci-dessous sont quelques-uns de corriger les modèles pour la gestion des Singletons.
Vous pouvez voir qu'une instance de la
Singleton
classe, qui a de l'instance (ou non statique) membres, est créé soit par l'initialisation statique ou dans le constructeur statique, et est affecté à la variable_singleton
.. Nous utilisons ce modèle pour s'assurer qu'il est instancié qu'une seule fois. Ensuite, la méthode statiqueInstance
fournit un accès en lecture seule à la sauvegarde de champ variable, qui contient notre une, et une seule instance deSingleton
.ou, exactement la même chose mais avec un statique explicite constructeur:
Vous pouvez également utiliser une propriété par défaut sans un accord explicite de champ (à suivre) ou dans un constructeur statique peut affecter la seule propriété (non illustré).
Depuis constructeurs statiques sont garanti exactement une fois, qu'il soit implicite ou explicite, alors il y a sans fil les questions de sécurité. Notez que tout l'accès à la
Singleton
classe peut déclencher initialisation statique, même de type à réflexion accès.Vous pouvez penser à des membres statiques d'une classe comme presque comme un distinct, bien relié, classe:
D'Instance (non statique) des membres de la fonction comme une classe normale. Ils ne vivent pas jusqu'à ce que vous effectuez
new Class()
sur eux. Chaque fois que vous faitesnew
, vous obtenez une nouvelle instance. Les membres de l'Instance ont accès à tous les membres statiques, y compris les membres privés (dans la même classe).Membres statiques sont comme les membres d'une autre, spécial instance de la classe que vous ne pouvez pas créer explicitement à l'aide de
new
. À l'intérieur de cette classe, seuls les membres statiques ne peuvent être accessibles ou de l'ensemble. Il y a un implicite ou explicite d'un constructeur statique qui .Net s'exécute à l'heure d'un premier accès (tout comme l'instance de classe, seulement vous n'avez pas explicitement le créer, il est créé si nécessaire). Les membres statiques d'une classe peuvent être consultées par tout autre classe, à tout moment, dans ou hors d'une instance, bien que dans le respect des modificateurs d'accès tels queinternal
ouprivate
.J'ai mis à jour ma réponse. Est-ce mieux?
Vous ne devriez pas poster une réponse pour dire que la question n'a pas de sens. Si vous pensez que la question n'a pas de sens, voter pour le fermer peu clair, plutôt que de poster une réponse à une question que vous ne pensez pas est compréhensible.
La question écrite n'a pas de sens, toutefois, le demandeur est la confusion est facile à comprendre et faciles à corriger. Avez-vous une ressource sur meta.stackexchange à l'appui de votre position, que "la question n'a pas de sens comme l'écrit"? En tout cas, je vais reformuler-à-dire que le sens des déclarations de faire quelques erreurs, que je peux vous aider à corriger pour lui.
Je n'ai pas besoin de vous prouver que la question n'a pas de sens. Vous sont l'un disant que la question n'a pas de sens, à la fois dans votre réponse (sur plusieurs reprises) et dans votre commentaire.
OriginalL'auteur ErikE
Pour répondre à la question posée:
Il est incroyablement stupide (mais possible) pour créer un singleton sans un champ statique.
Pour ce faire, vous devez utiliser un autre champ statique, comme
domaine d'application.GetData
ou (dans ASP.Net)HttpContext.Application
.OriginalL'auteur SLaks
Juste pour répondre à votre question (je l'espère): au Lieu d'utiliser une classe statique contenant membres statiques comme Class1 vous pouvez implémenter le pattern Singleton comme dans Class2 (merci de ne pas commencer une discussion à propos de l'initialisation tardive à ce stade):
Au lieu de l'appeler
Class1.DoSomething()
vous pouvez utiliserClass2.GetInstance().DoSomething()
.Edit: Comme vous pouvez le voir il y a encore un (privé) champ statique à l'intérieur de Class2 le tenant de l'instance.
Edit2 en réponse à user966638 commentaire:
Dois-je comprendre que vous corriger ce que vous avez le code comme ceci:
Et votre collègue suggère de le remplacer par cela?
Cela pourrait être le cas si vous voulez avoir différentes Foo cas où chaque instance, le bar de l'attribut peut être défini à null par exemple. Mais je ne suis pas sûr s'il voulait dire ce qu'est exactement le cas d'utilisation il parle.
Class2
static
.Mais la classe initiale n'était pas statique. Il était normal de la classe qui contient des méthodes et des variables. Certaines de ces variables sont statiques.
svick: Vu que l'erreur de trop et corrigée déjà. Merci quand même.
OriginalL'auteur Silas
Les deux singleton et variables statiques de vous donner un exemple d'une classe. Pourquoi vous devriez préférer singleton plus statique est
Espère que cette aide
Ce n'est pas vrai du tout. Vous ne pouvez pas gérer la durée de vie d'un singleton. Les Singletons ne pas vous aider à atteindre la sécurité des threads. Toutes vos demandes (vrai ou pas) s'appliquent également aux champs statiques.
ThreadStaticAttribute
Un champ statique ou des biens détient toujours une instance unique de sa valeur.
n'est pas en discussion. Le point que je faisais est simple - si vous exposez un champ statique, directement ou par l'intermédiaire d'un bien, il est encore un exemple.
OriginalL'auteur Suhas